Tengo un EF7 DbContext
con seguimiento de cambios deshabilitado porque quiero marcar todos los cambios explícitamente:
var entry = context.Entry(changedEntity);
entry.Property(propertyName).IsModified = true;
Esto funciona exactamente como lo quiero.
Sin embargo, esto no funciona cuando se ha actualizado una referencia (propiedad de navegación).
Por ejemplo, digamos que mi entidad tiene dos propiedades: ParentId
y Parent
donde ParentId
es una clave externa y Parent
es la referencia a la entidad principal.
Vocación
entry.Property("Parent").IsModified = true;
no funciona y lanza la ModelItemNotFoundException
porque Parent
no es una propiedad de la entidad en términos de EF (en su lugar, es una navegación).
En EF6, esto podría hacerse de la siguiente manera:
var reference = context.Entry(changedEntity).Reference("Parent");
reference.CurrentValue = reference.CurrentValue;
EN EF7, no hay tal función. Puedo llegar al objeto de INavigation
con
entry.Metadata.GetNavigation("Parent")
pero no puede ver ninguna forma de marcarlo como modificado.
Entonces, ¿cómo debo hacerlo?
Nota: Sé que la configuración de ParentId
funcionaría, pero esto no es adecuado para mí porque la entidad a la que se hace referencia aún no tiene una ID, ya que se acaba de crear y obtendrá su ID de la base de datos cuando se guarde. Por lo tanto, necesito configurarlo a través del Parent
referencia.
Editar:
La nota anterior era cierta para el EF6 pero ya no es válida para el EF7 del cual no tenía conocimiento. Por lo tanto, la solución es tal como se describe en la nota y la respuesta a continuación.
Wow, parece que cuando una nueva entidad se adjunta al DbContext
, en realidad obtiene ID (-1 en mi caso). Por lo tanto, puedo establecer ParentId
incluso cuando la entidad de destino es nueva y aún no se ha agregado a la base de datos.
Me pregunto si hay alguna verificación de que la nueva ID sea única (ya podría haber una entrada con ID -1 en la base de datos).