我正在使用实体框架将数据持久保存在 N 层 Wpf 应用程序中。我的 dbcontext 在所有存储库中共享,并且从未被处置。当我持久化数据时,我将对象标记为已修改并尝试保存更改。如果在持久化对象时发生错误,则该对象仍被标记为已修改,并且如果用户中止当前操作,他将在保存另一个对象时得到相同的错误。
我通过在我的 dbcontext 中覆盖 SaveChanges 解决了这个问题,如果出现任何错误,我接受所有更改(参见下面的代码)。因此,如果对象发生错误并且所有对象都被标记为不变,即使它们没有被持久化。
这感觉不对……有人同意这个解决方案吗? 另一种解决方案是在我的存储库中的每个方法中新建 dbcontext 并立即处理它们。这将使我的存储库更加复杂和“嘈杂”,并且我还将失去延迟加载数据的能力...... 有人对我有不同的解决方案吗?
//In my repositories
public void UpdateObject(Object object)
{
dbContext.Entry(object).State = EntityState.Modified;
dbContext.SaveChanges();
}
//In my dbcontext class
private ObjectContext ObjectContext()
{
return (this as IObjectContextAdapter).ObjectContext;
}
public override int SaveChanges()
{
try
{
return base.SaveChanges();
}
catch (Exception)
{
ObjectContext().AcceptAllChanges();
throw;
}
}