Я нашел три способа решения проблемы.
Уникальные индексы в EntityFramework Ядро:
Первый подход:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
Второй подход для создания уникальных сдерживающих с EF Ядра с помощью альтернативных ключей.
Примеры
Одна колонка:
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.
Это верно для аннотаций данных :), если вы хотите, чтобы ответ на использование свободного API см. В ответе Ниаера ниже http: // stackoverflow.com/a/25779348/2362036 – tekiegirl
Не работает для свойств навигации/внешнего ключа – JJS
Но мне нужно, чтобы он работал на внешние ключи! Вы можете мне помочь? –