J'ai un référentiel comme ça:
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();
}
}
À présent, cela fonctionne pour toutes les propriétés scalaires de l'entité, mais toutes les autres entités associées aux propriétés de l'entité typeOf(T)
ne se soucient pas de modifier cet état, et EF ajoute simplement de nouvelles données.
Donc, si vous faites par exemple Repository<Student>.Update()
, et que vous avez seulement changé le nom, il trouvera le bon Etudiant et changera son nom, mais changera également le Campus, bien qu'un campus soit déjà associé cet étudiant, il sera créé à nouveau avec un CampusId différent.
Montrez-moi s'il vous plaît la bonne façon de faire des mises à jour dans cette situation.
Ce que j'ai fait quand je voulais suivre une approche générique a été traduit dans votre code, par exemple:
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();
}
}
Tout mon code a ensuite fonctionné comme:
var attachedEntity = repository.Find(someId);
// Merge all changes into attached entity here
repository.Update(attachedEntity);
=> Faire cela de manière générique déplace beaucoup de logique dans votre couche supérieure. Il n’existe pas de meilleur moyen de sauvegarder de grands graphiques d’objets détachés (en particulier lorsque des relations plusieurs-à-plusieurs sont impliquées et que la suppression de relations est impliquée).