ฉันพบวิธีแก้ปัญหาสามวิธี
ดัชนีที่ไม่ซ้ำกันใน EntityFramework Core:
วิธีแรก:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
วิธีที่สองในการสร้างข้อ จำกัด ที่ไม่ซ้ำกับ EF Core โดยใช้คีย์สำรอง
ตัวอย่าง
หนึ่งคอลัมน์:
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 ไม่รู้อะไรเกี่ยวกับการเปลี่ยนแปลงเหล่านั้น!
วิธีที่สอง:
ฉันพบมันในโพสต์นี้ แต่ฉันไม่ได้ลองด้วยตัวเอง
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
ปัญหาของวิธีนี้มีดังต่อไปนี้: มันต้องการ 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
ปัญหาสำหรับแนวทางนี้ ฉันจะรวมพวกเขาได้อย่างไร ฉันมีความคิดที่จะขยายการใช้งานของ Microsoft เช่น:
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
ในภายหลังใน IDatabaseInitializer ตามที่อธิบายไว้ในตัวอย่างของ Microsoft คุณสามารถรวมคีย์ตามจำนวนเต็มที่กำหนด สิ่งหนึ่งที่จะต้องมีการจดบันทึกแม้ว่า: ถ้าคุณสมบัติที่เป็นเอกลักษณ์ของสตริงประเภทแล้วคุณจะต้องตั้งค่า MaxLength