在使用Entity Framework 6的项目中,我的一般模式是
DBSet
的相关DbContext
DbContext.SaveChanges()
这是我的意思的一些伪代码:
// Psuedo code to illustrate process.
void AddProcess()
{
var modelsToAdd = GetModelsToAdd();
try
{
_context.Models.AddRange(modelsToAdd);
_context.SaveChanges();
// If we get here all is good.
}
catch (Exception ex)
{
_context.RemoveRange(modelsToAdd);
throw;
}
finally
{
//....
}
}
我知道SaveChanges()
方法在内部创建了自己的Transaction
,因此如果在保存期间存在异常,则会回滚。但是,如果在DbSet
期间发生错误,我想要的是将(2)中添加的实体从SaveChanges()
中删除。基本上,好像从未发生过“添加”过程。
如您所见,目前我正在缓存所涉及模型的列表,然后在发生异常时将其删除。
我想知道的是,有更好的方法可以使用Transactions自动为我工作吗?那么,Transaction
的内部SaveChanges()
回滚能否回滚到DbSet
的任何附加物?或者可以使用其他交易吗?
实现我想要的最佳/首选方式是什么?我对EF很新,所以这可能是显而易见的。
https://code.msdn.microsoft.com/How-to-undo-the-changes-in-00aed3c4中的选项#1通常足以满足您希望在不删除和重新实例化Context的情况下回滚DbContext中的更改的大多数实现。通常,请求将失败并且调用将结束,因此DbContext范围应该结束,直到在新请求中尝试重试为止。
如果有一个非常好的理由可以立即重试/替换操作,我只会考虑回滚DbContext。想要在SaveChanges失败的情况下回滚DbSets通常是指示DbContext保持活动的时间太长。
在失败的情况下需要保存的日志记录等重要事项应该使用专用的DbContext,以便应用程序的DbContext上的失败的SaveChanges不会阻碍它们的更新。