問題を解決する 3 つの方法を見つけました。
EntityFramework Core の一意のインデックス:
最初のアプローチ:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
代替キーを使用して EF Core で一意の制約を作成する 2 番目の方法。
例
1 列:
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"));
このアプローチは非常に高速で便利ですが、主な問題は、Entity Framework がこれらの変更について何も知らないことです!
2 番目のアプローチ:
この投稿で見つけましたが、自分で試したことはありません。
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
このアプローチの問題点は次のとおりです。DbMigration が必要なので、それがない場合はどうしますか?
3 番目のアプローチ:
これが最善の方法だと思いますが、それには時間がかかります。その背後にあるアイデアをお見せします: このリンク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
このアプローチの問題。どうすればそれらを組み合わせることができますか? たとえば、このMicrosoftの実装を拡張する考えがあります:
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
Microsoft の例で説明されているように、後で IDatabaseInitializer で、指定された整数に従ってキーを組み合わせることができます。ただし、注意すべき点が 1 つあります。一意のプロパティが文字列型の場合は、MaxLength を設定する必要があります。