我正在使用实体框架将数据保存在N层Wpf应用程序中。我的dbcontext在所有存储库之间共享,并且永远不会丢弃。当我坚持数据时,我将一个对象标记为已修改,并尝试保存更改。如果在持久化对象时出现错误,则对象仍被标记为已修改,并且如果用户中止当前操作,则在保存另一个对象时他将得到相同的错误。使用单个dbcontext时发生异常后恢复
我已经在我的DbContext覆盖的SaveChanges,如果任何错误accurs我接受所有的变化(见下面的代码)解决了这个。所以如果一个错误产生了对象,并且所有对象都被标记为未改变,即使他们没有持续。
这感觉不对...... 有谁这个解决方案同意吗? 另一个解决方案是在我的存储库中的每个方法中新建dbcontext并立即处理它们。这将使我的存储库更加复杂和“noicy”,我也将失去延迟加载数据的能力... 有没有人对我有不同的解决方案?
//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;
}
}
思为您answear :) 我曾想过你的解决方案,对我来说不能很好地工作。我正在使用TDD和依赖注入。 回购是通过构造函数注入在我的业务逻辑中发送的。有了你的解决方案,我将不得不为dbcontext建立一个工厂,并为每个存储库建立一个工厂。 这感觉就像过分复杂的业务逻辑和业务逻辑与事关他们...... – Jakob 2013-04-29 09:32:29
在上面的业务逻辑中,dbcontext和存储库都可以通过构造函数注入。就像我在回答中提到的,这只是一个简单的例子。如果您使用关键字(如dbcontext作用域生存期)对Google进行了一些研究,则会发现大多数ppl建议使用短期上下文。根据我自己的经验,我们发现了一个人忘记处理上下文的错误,并且它在Web服务上引起了50ms的查询,需要3.2分钟才能执行。 – failedprogramming 2013-04-30 22:00:52