Znalazłem trzy sposoby rozwiązania problemu.
Unikalne indeksy w EntityFramework Core:
Pierwsze podejście:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
Drugie podejście do tworzenia unikalnych ograniczeń za pomocą EF Core za pomocą alternatywnych kluczy.
Przykłady
Jedna kolumna:
modelBuilder.Entity<Blog>().HasAlternateKey(c => c.SecondColumn).HasName("IX_SingeColumn");
Wiele kolumn:
modelBuilder.Entity<Entity>().HasAlternateKey(c => new [] {c.FirstColumn, c.SecondColumn}).HasName("IX_MultipleColumns");
EF 6 i poniżej:
Pierwsze podejście:
dbContext.Database.ExecuteSqlCommand(string.Format(
@"CREATE UNIQUE INDEX LX_{0} ON {0} ({1})",
"Entitys", "FirstColumn, SecondColumn"));
To podejście jest bardzo szybkie i przydatne, ale głównym problemem jest to, że Entity Framework nie wie nic o tych zmianach!
Drugie podejście:
znalazłem to w tym poście, ale nie próbowałem sam.
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
Problem tego podejścia jest następujący: Wymaga DbMigration, więc co robisz, jeśli go nie masz?
Trzecie podejście:
myślę, że jest to najlepsze, ale zajmuje to trochę czasu. Pokażę ci po prostu pomysł: w tym linku http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a
można znaleźć kod unikalnej adnotacji danych kluczowych:
[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
Problem tego podejścia; Jak mogę je połączyć? Mam pomysł na rozszerzenie tej implementacji Microsoft na przykład:
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
Później w IDatabaseInitializer, jak opisano w przykładzie Microsoft, możesz łączyć klucze zgodnie z podaną liczbą całkowitą. Należy jednak zwrócić uwagę na jedno: jeśli unikalna właściwość jest typu string, musisz ustawić MaxLength.