Dies könnte eine einfache Frage sein, aber ich bin neu in Code First und Migrations so mit mir. Ich werde Beispielcode auf ein Minimum beschränken, um das Problem zu zeigen:
Ich habe eine BaseAuditableEntity
, die das beinhaltet (unter anderem, aber vereinfachen wir):
Nun erbt ein (zum Beispiel) User
POCO davon:
Ich habe dies in der Methode SaveChanges
meines Kontextes, um die Daten CreatedOn
und LastModified
(vereinfacht) einzugeben:
Und jetzt habe ich eine Migration an Ort und Stelle, die einige Benutzer wie folgt sät:
%Vor% Jetzt habe ich ein Problem beim Seeding mit AddOrUpdate
nach der Migration. Wenn das Element neu ist (es wird hinzugefügt), wird CreatedOn
korrekt gefüllt und alles funktioniert wie erwartet. Wenn die Entität jedoch geändert wird (sie ist bereits in der Datenbank vorhanden und UserName
stimmt überein), versucht sie, sie mit der neuen Entität zu aktualisieren, die ich erstelle ... dies schlägt fehl, weil CreatedOn
eine ungültige DateTime
(in In diesem Fall DateTime.MinValue
).
Gibt es eine Möglichkeit, die AddOrUpdate
-Methode zu verwenden, so dass sie tatsächlich die übereinstimmende Entität aus der Datenbank abruft und nur die nicht standardmäßigen Felder aktualisiert? Oder vielleicht eine Art zu sagen, welche Felder NICHT zu aktualisieren? Für diesen speziellen Fall möchte ich, dass das Feld CreatedOn
unverändert bleibt, aber eine allgemeine Lösung wäre wünschenswert.
Vielleicht sollte ich meine eigene AddOrUpdate
-Methode machen, die ein Prädikat mit den Feldern enthält, die ich ändern möchte, anstatt eine komplett neue Entität zu übergeben?
Dies ist EF 6.1
Ich weiß, dass ich das für das CreatedOn
-Datum leicht lösen kann, das mache ich gerade für diesen speziellen Fall:
Ich suche jedoch nach einer allgemeineren Lösung
Die Implementierung von AddOrUpdate
verwendet CurrentValues.SetValues
, damit alle skalaren Eigenschaften geändert werden.
Ich habe die Funktionalität so erweitert, dass Eigenschaften akzeptiert werden, die geändert werden sollen, wenn es sich um ein Update handelt, andernfalls ist es eine Erstellung, verwenden Sie einfach DbSet<T>::Add
.
Verwendung.
%Vor%Tags und Links c# entity-framework code-first-migrations