Making AddOrUpdate ändert nur einige Eigenschaften

8

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):

%Vor%

Nun erbt ein (zum Beispiel) User POCO davon:

%Vor%

Ich habe dies in der Methode SaveChanges meines Kontextes, um die Daten CreatedOn und LastModified (vereinfacht) einzugeben:

%Vor%

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

Aktualisieren

Ich weiß, dass ich das für das CreatedOn -Datum leicht lösen kann, das mache ich gerade für diesen speziellen Fall:

%Vor%

Ich suche jedoch nach einer allgemeineren Lösung

    
Jcl 19.09.2014, 07:14
quelle

1 Antwort

10

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 .

%Vor%

Verwendung.

%Vor%     
Yuliam Chandra 19.09.2014, 09:50
quelle