私は問題を解決する3つの方法を見つけました。
EntityFramework Coreの一意のインデックス:
最初のアプローチ:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
第二のアプローチ代替キーを使用してEF Coreで一意の制約を作成する。
例
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を設定する必要があります。