Tengo un repositorio como ese:
public class Repository<T> : IRepository<T> where T : class
{
private readonly IRepositoryContext _repositoryContext;
public Repository(IRepositoryContext repositoryContext)
{
_repositoryContext = repositoryContext;
_objectSet = repositoryContext.GetObjectSet<T>();
}
public virtual void Update(T entity)
{
ObjectSet.AddObject(entity);
_repositoryContext.ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
_repositoryContext.SaveChanges();
}
}
Ahora eso realmente funciona para todas las propiedades escalares de la entidad, pero todas las demás entidades que se asociaron con las propiedades de la entidad typeOf(T)
, no importa que el estado de la entidad se modifique, y EF simplemente agrega datos nuevos.
Entonces, si lo hace, por ejemplo, Repository<Student>.Update()
, y solo cambió el nombre, encontrará al Estudiante correcto y cambiará su nombre, pero también cambiará el Campus, aunque ya tiene un Campus asociado con ese estudiante, será creado nuevamente con un CampusId diferente.
Muéstrame por favor la forma correcta de hacer actualizaciones en esta situación.
Lo que hice cuando quise seguir el enfoque genérico se tradujo a su código, algo así como:
public class Repository<T> : IRepository<T> where T : class
{
...
public virtual void Update(T entity)
{
if (context.ObjectStateManager.GetObjectStateEntry(entity).State == EntityState.Detached)
{
throw new InvalidOperationException(...);
}
_repositoryContext.SaveChanges();
}
}
Todo mi código luego funcionó como:
var attachedEntity = repository.Find(someId);
// Merge all changes into attached entity here
repository.Update(attachedEntity);
=> Hacer esto de manera genérica mueve mucha lógica a tu capa superior. No hay mejor manera de guardar grandes gráficos de objetos separados (especialmente cuando se trata de relaciones de muchos a muchos y se trata de eliminar relaciones).