Sorunu çözmek için üç yol buldum.
EntityFramework Çekirdeğindeki benzersiz dizinler:
İlk yaklaşım:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
Alternatif Anahtarlar kullanarak EF Core ile Benzersiz Kısıtlamalar oluşturmak için ikinci yaklaşım .
Örnekler
Bir sütun:
modelBuilder.Entity<Blog>().HasAlternateKey(c => c.SecondColumn).HasName("IX_SingeColumn");
Birden çok sütun:
modelBuilder.Entity<Entity>().HasAlternateKey(c => new [] {c.FirstColumn, c.SecondColumn}).HasName("IX_MultipleColumns");
EF 6 ve altı:
İlk yaklaşım:
dbContext.Database.ExecuteSqlCommand(string.Format(
@"CREATE UNIQUE INDEX LX_{0} ON {0} ({1})",
"Entitys", "FirstColumn, SecondColumn"));
Bu yaklaşım çok hızlı ve kullanışlıdır, ancak asıl sorun Entity Framework'ün bu değişiklikler hakkında hiçbir şey bilmemesidir!
İkinci yaklaşım:
Bu yazıda buldum ama kendim denemedim.
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
Bu yaklaşımın sorunu şudur: DbMigration gerekir, bu nedenle yoksa ne yaparsınız?
Üçüncü yaklaşım:
Bence bu en iyisi ama bunu yapmak için biraz zaman gerekiyor. Sadece arkasındaki fikri göstereceğim: Bu bağlantıda http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a
benzersiz anahtar veri ek açıklamasının kodunu bulabilirsiniz:
[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
Bu yaklaşımın sorunu; Bunları nasıl birleştirebilirim? Örneğin, bu Microsoft uygulamasını genişletmek için bir fikrim var:
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
Daha sonra Microsoft örneğinde açıklandığı gibi IDatabaseInitializer içinde anahtarları verilen tamsayıya göre birleştirebilirsiniz. Yine de dikkat edilmesi gereken bir nokta var: unique özelliği string türündeyse, MaxLength ayarlamanız gerekir.