我找到了三种方法来解决这个问题。
EntityFramework核心中唯一的索引:
第一种方法:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
第二种方法创建唯一的约束与EF核心使用备用键。
例子
一列:
modelBuilder.Entity<Blog>().HasAlternateKey(c => c.SecondColumn).HasName("IX_SingeColumn");
多个列:
modelBuilder.Entity<Entity>().HasAlternateKey(c => new [] {c.FirstColumn, c.SecondColumn}).HasName("IX_MultipleColumns");
EF 6及以下:
第一种方法:
dbContext.Database.ExecuteSqlCommand(string.Format(
@"CREATE UNIQUE INDEX LX_{0} ON {0} ({1})",
"Entitys", "FirstColumn, SecondColumn"));
这种方法非常快速和有用,但主要的问题是实体框架不知道任何关于这些变化!
第二种方法:
我在这篇文章中找到了它,但我没有自己尝试。
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
这种方法的问题如下:它需要DbMigration,如果没有DbMigration怎么办?
第三种方法:
我认为这是最好的一个,但它需要一些时间来做。我将向你们展示它背后的思想:
在这个链接http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a
你可以找到唯一键数据注释的代码:
[UniqueKey] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey] // Unique Key
public int SecondColumn { get; set;}
// The problem hier
1, 1 = OK
1 ,2 = NO OK 1 IS UNIQUE
这种方法的问题是;我如何将它们结合起来?
我有一个想法来扩展这个微软实现,例如:
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
稍后在微软示例中描述的IDatabaseInitializer中,您可以根据给定的整数组合键。
有一件事必须注意:如果唯一属性的类型是字符串,那么你必须设置MaxLength。