Tôi tìm thấy ba cách để giải quyết vấn đề.
Các chỉ mục duy nhất trong EntityFramework Core:
Cách tiếp cận đầu tiên:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
Cách tiếp cận thứ hai để tạo các ràng buộc duy nhất với EF Core bằng cách sử dụng các phím thay thế.
Ví dụ
Một cột:
modelBuilder.Entity<Blog>().HasAlternateKey(c => c.SecondColumn).HasName("IX_SingeColumn");
Nhiều cột:
modelBuilder.Entity<Entity>().HasAlternateKey(c => new [] {c.FirstColumn, c.SecondColumn}).HasName("IX_MultipleColumns");
EF 6 trở xuống:
Cách tiếp cận đầu tiên:
dbContext.Database.ExecuteSqlCommand(string.Format(
@"CREATE UNIQUE INDEX LX_{0} ON {0} ({1})",
"Entitys", "FirstColumn, SecondColumn"));
Cách tiếp cận này rất nhanh và hữu ích nhưng vấn đề chính là Entity Framework không biết gì về những thay đổi đó!
Cách tiếp cận thứ hai:
Tôi đã tìm thấy nó trong bài viết này nhưng tôi đã không tự mình thử.
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
Vấn đề của phương pháp này là như sau: Nó cần DbMigration, vậy bạn sẽ làm gì nếu không có nó?
Cách tiếp cận thứ ba:
Tôi nghĩ rằng đây là cách tốt nhất nhưng nó cần một chút thời gian để làm điều đó. Tôi sẽ chỉ cho bạn ý tưởng đằng sau nó: Trong liên kết này http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a
bạn có thể tìm thấy mã cho chú thích dữ liệu khóa duy nhất:
[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
Vấn đề cho phương pháp này; Làm thế nào tôi có thể kết hợp chúng? Tôi có một ý tưởng để mở rộng triển khai Microsoft này chẳng hạn:
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
Sau này trong IDatabaseInitializer như được mô tả trong ví dụ của Microsoft, bạn có thể kết hợp các khóa theo số nguyên đã cho. Một điều cần phải lưu ý: Nếu thuộc tính duy nhất là kiểu chuỗi thì bạn phải đặt MaxLạng.