Marquage de la propriété de navigation telle que modifiée dans Entity Framework 7

entity-framework-core

Question

J'ai un EF7 DbContext avec un suivi des modifications désactivé car je souhaite marquer explicitement toutes les modifications:

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

Cela fonctionne exactement comme je le veux.

Toutefois, cela ne fonctionne pas lorsqu'une référence (propriété de navigation) a été mise à jour.

Par exemple, supposons que mon entité ait deux propriétés - ParentId et ParentParentId est une clé étrangère et Parent est la référence à l'entité parent.

Appel

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

ne fonctionne pas et lève une ModelItemNotFoundException car Parent n'est pas une propriété de l'entité en termes de EF (c'est une navigation à la place).

Dans EF6, cela pourrait être fait comme suit:

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

EN EF7, cette fonction n'existe pas. Je peux arriver à l'objet INavigation avec

entry.Metadata.GetNavigation("Parent")

mais ne voit aucun moyen de le marquer comme modifié.

Alors, comment devrais-je le faire?

Remarque: Je sais que définir ParentId fonctionnerait, mais cela ne me convient pas car l'entité référencée n'a pas encore d'ID car elle vient d'être créée et obtiendra son ID de la base de données lors de son enregistrement. Ainsi, je dois le définir via le Parent référence.

Modifier:

La remarque ci-dessus était vraie pour EF6 mais n'est plus valable pour EF7 dont je n'étais pas au courant. Ainsi, la solution est telle que décrite dans la note et la réponse ci-dessous.

Réponse acceptée

Wow, il semble que quand une nouvelle entité est attachée au DbContext , elle obtient en réalité un identifiant (-1 dans mon cas). Ainsi, je peux définir ParentId même lorsque l'entité cible est nouvelle et qu'elle n'a pas encore été ajoutée à la base de données.

Je me demande s'il existe des vérifications que le nouvel ID est unique (il pourrait déjà y avoir une entrée avec ID -1 dans la base de données).



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi