Navigationseigenschaft markieren, wie in Entity Framework 7 geändert

entity-framework-core

Frage

Ich habe einen EF7 DbContext mit deaktivierter Änderungsverfolgung, weil ich alle Änderungen explizit markieren möchte:

var entry = context.Entry(changedEntity);
entry.Property(propertyName).IsModified = true;

Das funktioniert genau so, wie ich es möchte.

Dies funktioniert jedoch nicht, wenn eine Referenz (Navigationseigenschaft) aktualisiert wurde.

ParentId wir an, meine Entität hat zwei Eigenschaften - ParentId und Parent wobei ParentId ein Fremdschlüssel und Parent die Referenz auf die Parent-Entität ist.

Berufung

entry.Property("Parent").IsModified = true;

funktioniert nicht und ModelItemNotFoundException da Parent keine Eigenschaft der Entity in Bezug auf EF ist (es ist stattdessen eine Navigation).

In EF6 könnte dies wie folgt geschehen:

var reference = context.Entry(changedEntity).Reference("Parent");
reference.CurrentValue = reference.CurrentValue;

In EF7 gibt es keine solche Funktion. Ich kann mit dem INavigation Objekt erreichen

entry.Metadata.GetNavigation("Parent")

aber ich sehe keinen Weg es als modifiziert zu markieren.

Also, wie soll ich das machen?

Hinweis: Ich weiß, dass die Einstellung ParentId würde, aber dies ist für mich nicht geeignet, da die referenzierte Entität noch keine ID hat, da sie gerade erstellt wurde und ihre ID beim Speichern aus der Datenbank bezieht. Daher muss ich es über den Verweis Parent festlegen.

Bearbeiten:

Die obige Anmerkung gilt für EF6, ist aber für EF7 nicht mehr gültig, was mir nicht bekannt war. Somit ist die Lösung genau so, wie in der Anmerkung und Antwort unten beschrieben.

Akzeptierte Antwort

Wow, es DbContext so aus, als wenn eine neue Entität an den DbContext angehängt wird, DbContext sie tatsächlich ID (-1 in meinem Fall). So kann ich ParentId selbst wenn die Zieleinheit neu ist und nicht in die Datenbank aufgenommen worden.

Ich frage mich, ob es irgendwelche Überprüfungen gibt, dass die neue ID eindeutig ist (es könnte bereits einen Eintrag mit ID -1 in der Datenbank geben).



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum