Ho un repository del genere:
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();
}
}
Ora che in realtà funziona per tutte le proprietà scalari dell'entità, ma tutte le altre entità associate alle proprietà di tipo di typeOf(T)
, non si preoccupano che lo stato dell'entità sia modificato, e EF aggiunge semplicemente nuovi dati.
Quindi, se lo fai ad esempio Repository<Student>.Update()
, e hai solo cambiato il nome, troverà lo Studente giusto e cambierà il suo nome, ma cambierà anche il Campus, anche se hai già un Campus associato a quello studente, verrà ricreato con un altro CampusId.
Mostrami per favore il modo corretto di fare aggiornamenti in questa situazione.
Quello che ho fatto quando volevo seguire un approccio generico è stato tradotto nel tuo codice qualcosa come:
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();
}
}
Tutto il mio codice quindi ha funzionato come:
var attachedEntity = repository.Find(someId);
// Merge all changes into attached entity here
repository.Update(attachedEntity);
=> Fare questo in modo generico sposta molta logica nel tuo livello superiore. Non esiste un modo migliore per salvare grandi grafici di oggetti distaccati (specialmente quando sono coinvolte relazioni molti-a-molti e viene coinvolta l'eliminazione delle relazioni).