Я нашел три способа решения проблемы.
Уникальные индексы в 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, вы можете комбинировать ключи в соответствии с заданным целым числом. Однако следует отметить одну вещь: если уникальное свойство имеет тип string, то вы должны установить MaxLength.