Ich verwende zuerst Entity Framework 5.0 Code.
public class Entity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public string EntityId { get; set;}
public int FirstColumn { get; set;}
public int SecondColumn { get; set;}
}
Ich möchte die Kombination zwischen FirstColumn
und SecondColumn
als einzigartig machen.
Beispiel:
Id FirstColumn SecondColumn
1 1 1 = OK
2 2 1 = OK
3 3 3 = OK
5 3 1 = THIS OK
4 3 3 = GRRRRR! HERE ERROR
Gibt es sowieso etwas zu tun?
entity-framework
ef-code-first
constraints
multiple-columns
unique-key
Bassam Alugili
quelle
quelle
Ich habe drei Möglichkeiten gefunden, um das Problem zu lösen.
Eindeutige Indizes in EntityFramework Core:
Erste Ansatz:
Der zweite Ansatz zum Erstellen eindeutiger Einschränkungen mit EF Core mithilfe alternativer Schlüssel.
Beispiele
Eine Spalte:
Mehrere Spalten:
EF 6 und darunter:
Erste Ansatz:
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.
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:
Das Problem für diesen Ansatz; Wie kann ich sie kombinieren? Ich habe eine Idee, diese Microsoft-Implementierung zu erweitern, zum Beispiel:
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.
quelle
CREATE UNIQUE INDEX ix_{1}_{2} ON {0} ({1}, {2})
? (siehe BOL )Wenn Sie Code-First verwenden , können Sie eine benutzerdefinierte Erweiterung HasUniqueIndexAnnotation implementieren
Dann benutze es so:
Was zu dieser Migration führen wird:
Und schließlich in der Datenbank landen als:
quelle
this.Property(t => t.Email)
Was enthält die Klasse in Ihrem zweiten Codeblock ( )? (dh: was istthis
)EntityTypeConfiguration<T>
Sie müssen einen zusammengesetzten Schlüssel definieren.
Mit Datenanmerkungen sieht es so aus:
Sie können dies auch mit modelBuilder tun, wenn Sie OnModelCreating überschreiben, indem Sie Folgendes angeben:
quelle
Die Antwort von niaher, dass Sie zur Verwendung der fließenden API eine benutzerdefinierte Erweiterung benötigen, war zum Zeitpunkt des Schreibens möglicherweise korrekt. Sie können jetzt (EF Core 2.1) die fließende API wie folgt verwenden:
quelle
Vervollständigung der @ chuck-Antwort für die Verwendung zusammengesetzter Indizes mit Fremdschlüsseln .
Sie müssen eine Eigenschaft definieren, die den Wert des Fremdschlüssels enthält. Sie können diese Eigenschaft dann in der Indexdefinition verwenden.
Zum Beispiel haben wir eine Firma mit Mitarbeitern und nur wir haben eine eindeutige Einschränkung (Name, Firma) für jeden Mitarbeiter:
Nun die Zuordnung der Employee-Klasse:
Beachten Sie, dass ich auch die Erweiterung @niaher für eindeutige Indexanmerkungen verwendet habe.
quelle
In der akzeptierten Antwort von @chuck gibt es einen Kommentar, der besagt, dass es im Fall von FK nicht funktioniert.
es hat bei mir funktioniert, bei EF6 .Net4.7.2
quelle
Ich gehe davon aus, dass Sie immer
EntityId
der Primärschlüssel sein möchten , daher ist das Ersetzen durch einen zusammengesetzten Schlüssel keine Option (schon allein deshalb, weil die Arbeit mit zusammengesetzten Schlüsseln weitaus komplizierter ist und es nicht sehr sinnvoll ist, Primärschlüssel zu haben, die auch Bedeutung haben in der Geschäftslogik).Das Mindeste, was Sie tun sollten, ist, einen eindeutigen Schlüssel für beide Felder in der Datenbank zu erstellen und beim Speichern von Änderungen speziell nach Ausnahmen für eindeutige Schlüsselverletzungen zu suchen.
Außerdem können (sollten) Sie vor dem Speichern von Änderungen nach eindeutigen Werten suchen. Der beste Weg, dies zu tun, ist eine
Any()
Abfrage, da dadurch die Menge der übertragenen Daten minimiert wird:Beachten Sie, dass diese Überprüfung allein niemals ausreicht. Zwischen der Prüfung und dem tatsächlichen Festschreiben besteht immer eine gewisse Latenz, sodass Sie immer die eindeutige Einschränkung + Ausnahmebehandlung benötigen.
quelle
Kürzlich wurde ein zusammengesetzter Schlüssel mit der Eindeutigkeit von 2 Spalten hinzugefügt, wobei der von 'chuck' empfohlene Ansatz verwendet wurde, danke @chuck. Nur diese Annäherung sah für mich sauberer aus:
quelle