Я знайшов три способи вирішити проблему.
Унікальні індекси в 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.