Ich habe so ein Repository:
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();
}
}
Nun, das funktioniert eigentlich für alle skalaren Eigenschaften der Entität, aber für alle anderen Entitäten, die mit Eigenschaften des EntitätstypsOf typeOf(T)
, ist es egal, dass der Entitätsstatus geändert wird und EF einfach neue Daten hinzufügt.
Wenn Sie beispielsweise Repository<Student>.Update()
und nur den Namen geändert haben, wird der richtige Student gefunden und der Name geändert, aber auch der Campus wird geändert, obwohl bereits ein Campus zugeordnet ist dieser Student wird mit einer anderen CampusId erneut erstellt.
Zeigen Sie mir bitte den richtigen Weg, um in dieser Situation Aktualisierungen vorzunehmen.
Was ich getan habe, als ich dem generischen Ansatz folgen wollte, wurde in Ihren Code übersetzt.
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();
}
}
Mein ganzer Code funktionierte dann wie folgt:
var attachedEntity = repository.Find(someId);
// Merge all changes into attached entity here
repository.Update(attachedEntity);
=> Wenn Sie dies auf generische Weise tun, wird eine Menge Logik in Ihre obere Ebene verschoben. Es gibt keinen besseren Weg, große Einzelobjektdiagramme zu speichern (insbesondere, wenn viele-zu-viele-Beziehungen und das Löschen von Beziehungen betroffen sind).