【发布时间】:2020-12-08 16:41:30
【问题描述】:
我创建了一个 Entity Framework 6 事务并更新了其中的一些数据,然后一些代码引发了异常。我捕捉到异常并回滚事务。但是,当我检查数据库时,我发现数据已经更新,即使我回滚了事务。
发生异常时如何防止数据被保存?
public void MainMethod(){
try {
MethodA();
}
catch (Exception) {
using (var tran = _context.Database.BeginTransaction())
{
try
{
var logObject = new LogObject();
logObject.text = "some text";
_context.LogObjects.Add(logObject);
_context.SaveChanges();
tran.Commit();//when an exception happens in MethodA, the method a data still saves, when this transaction gets committed here.
}
catch (Exception)
{
tran.Rollback();
throw;
}
}
}
}
public void MethodA()
{
using (var tran = _context.Database.BeginTransaction())
{
try
{
UpdateMyData();
_context.SaveChanges();
tran.Commit();
tran.Dispose();
}
catch (Exception)
{
tran.Rollback();
tran.Dispose();
throw;
}
}
}
public void UpdateMyData()
{
try
{
var dataRecord = _context.MySampleDataRecords.Where(x => x.isActive).First();
dataRecord.isActive = false; //This update is being saved to the database and it should not be saved
}
catch (Exception ex)
{
throw new Exception("Test exception");
}
}
【问题讨论】:
-
这能回答你的问题吗? Entity Framework 6 transaction rollback
-
@Roar 不幸的是它没有。根据该解释,我的代码中的 dataRecord.isActive = false 不应保存到数据库中,但由于某种原因它正在保存。
-
您确定
Db和_context指的是同一个DbContext 吗?无论如何,简单地尝试发布该问题的完整重现。您可能会自己发现问题,如果没有,请发布重现。 -
@DavidBrowne-Microsoft 是的,它们是相同的上下文,为了清楚起见,我什至更新了代码以使用相同的上下文。事实证明,我对 MethodA 的更改是在 MainMethod 中的事务上提交的。我曾尝试在 MethodA 上调用 Dispose,但问题仍然存在。
-
我使用以下答案解决了我的问题。从上下文中分离我的实体:stackoverflow.com/a/33901817/618916
标签: c# entity-framework transactions entity-framework-6