entity framework - tools - El uso de la entrada<TEntity>().CurrentValues.SetValues() no está actualizando las colecciones
entity framework save relationship (1)
SetValues
nunca actualiza las propiedades de navegación. Cuando ejecuta su código, solo conoce los cambios en las propiedades simples / complejas de la entidad que se pasó a su método de Update
. EF incluso no sabe acerca de las entidades relacionadas de la entidad que se pasaron a su método de Update
.
Debe informar a EF manualmente sobre cada cambio en su gráfico de objetos: EF no tiene ningún mecanismo de resolución para los gráficos de objetos .
No me he encontrado con esto antes, porque normalmente manejaba las colecciones por ellos mismos en lugar de modificarlas directamente en la entidad.
public class Schedule: BaseEntity
{
public Guid Id {get;set;}
public virtual int? DayOfTheWeekTypeId { get; set; }
public virtual DayOfTheWeekType DayOfTheWeekType { get; set; }
public virtual ICollection<Instructor> Instructors { get; set; }
public DateTime? StartDateTime { get; set; }
public DateTime? EndDateTime { get; set; }
public string SpecialInstructions { get; set; }
}
Clase de mapeo:
public ScheduleMapping()
{
HasMany(c => c.Instructors).WithMany().Map(m => { m.MapLeftKey("ScheduleId");
m.MapRightKey("InstructorId");
m.ToTable("Schedule_Instructors");
});
HasOptional(s => s.DayOfTheWeekType).WithMany().HasForeignKey(s => s.DayOfTheWeekTypeId).WillCascadeOnDelete(false);
Property(s => s.SpecialInstructions).IsMaxLength();
}
Este es mi método de actualización:
public virtual void Update(TEntity entity)
{
if (entity == null)
throw new ArgumentNullException("entity");
//this is the original persisted entity
var persistedEntity = _repository.GetById(entity.Id);
if(originalEntity != null)
{
entity.Id = persistedEntity.Id;
UnitOfWork.ApplyCurrentValues<TEntity>(originalEntity,entity);
UnitOfWork.Commit();
}
}
Este es el método que manejó la "fusión"
public void ApplyCurrentValues<TEntity>(TEntity original, TEntity current) where TEntity : class
{
base.Entry<TEntity>(original).CurrentValues.SetValues(current);
}
Si modifico la colección de instructores y luego trato de aplicar la actualización, parece que conserva mis valores originales. He intentado cargar la entidad de Programación antes de la actualización y realizar mis cambios, pero a veces eso provoca un error de PK (en la colección de Instructores) en el marco de la entidad. Como si estuviera intentando agregar una entidad con la misma clave. Entonces, en cambio, estoy reconstruyendo la entidad de Programación (incluida la ID) manualmente y luego la actualizo. Cuando hago eso, no recibo más errores, sin embargo, las colecciones de Instructores no cambian. Estoy pensando porque CurrentValues. SetValues se aplica según la entidad persistente y no mi versión actualizada. ¿Debo manejar mis actualizaciones de manera diferente o necesito un manejo adecuado?