Ich habe drei Möglichkeiten gefunden, um das Problem zu lösen.
Eindeutige Indizes in EntityFramework Core:
Erste Ansatz:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Entity>()
.HasIndex(p => new {p.FirstColumn , p.SecondColumn}).IsUnique();
}
Der zweite Ansatz zum Erstellen eindeutiger Einschränkungen mit EF Core mithilfe alternativer Schlüssel.
Beispiele
Eine Spalte:
modelBuilder.Entity<Blog>().HasAlternateKey(c => c.SecondColumn).HasName("IX_SingeColumn");
Mehrere Spalten:
modelBuilder.Entity<Entity>().HasAlternateKey(c => new [] {c.FirstColumn, c.SecondColumn}).HasName("IX_MultipleColumns");
EF 6 und darunter:
Erste Ansatz:
dbContext.Database.ExecuteSqlCommand(string.Format(
@"CREATE UNIQUE INDEX LX_{0} ON {0} ({1})",
"Entitys", "FirstColumn, SecondColumn"));
Dieser Ansatz ist sehr schnell und nützlich, aber das Hauptproblem ist, dass Entity Framework nichts über diese Änderungen weiß!
Zweiter Ansatz:
Ich habe ihn in diesem Beitrag gefunden, aber nicht selbst ausprobiert.
CreateIndex("Entitys", new string[2] { "FirstColumn", "SecondColumn" },
true, "IX_Entitys");
Das Problem dieses Ansatzes ist das folgende: Es benötigt DbMigration. Was tun Sie also, wenn Sie es nicht haben?
Dritter Ansatz:
Ich denke, dies ist der beste, aber es erfordert einige Zeit, um dies zu tun. Ich werde Ihnen nur die Idee dahinter zeigen: Unter diesem Link http://code.msdn.microsoft.com/CSASPNETUniqueConstraintInE-d357224a
finden Sie den Code für die eindeutige Annotation von Schlüsseldaten:
[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
Das Problem für diesen Ansatz; Wie kann ich sie kombinieren? Ich habe eine Idee, diese Microsoft-Implementierung zu erweitern, zum Beispiel:
[UniqueKey, 1] // Unique Key
public int FirstColumn { get; set;}
[UniqueKey ,1] // Unique Key
public int SecondColumn { get; set;}
Später im IDatabaseInitializer, wie im Microsoft-Beispiel beschrieben, können Sie die Schlüssel gemäß der angegebenen Ganzzahl kombinieren. Eines muss jedoch beachtet werden: Wenn die eindeutige Eigenschaft vom Typ string ist, müssen Sie die MaxLength festlegen.