DataContext.SubmitChanges()提交不需要的数据
本文关键字:不需要 数据 提交 SubmitChanges DataContext | 更新日期: 2023-09-27 18:26:34
我的网站上有下一个代码(当然,SO的示例非常简化):
XDataContext dataContext = new XDataContext();
int currentUserId = GetCurrentUserIdFromSession();
XUser currentUser = dataContext.Users.Single(u => u.Id == currentUserId);
try
{
using (var t = new TransactionScope())
{
int orderId = GetOrderIdFromSession();
XOrder order = dataContext.Orders.Single(o => o.Id == orderId);
order.Status = XOrderStatus.Completed;
order.TransactionId = SomeCalculations(); // exception here
order.CompletedOn = DateTime.UtcNow;
dataContext.SubmitChanges(); // 1
t.Complete();
}
}
catch (Exception ex)
{
XExceptionEvent exceptionEvent = new XExceptionEvent();
exceptionEvent.User = currentUser;
dataContext.ExceptionEvents.InsertOnSubmit(exceptionEvent);
dataContext.SubmitChanges(); // 2
}
当SomeCalculations()
抛出异常时,order
对象处于不一致状态(其Status
为XOrderStatus.Completed
,但未设置CompletedOn
)。没有调用dataContext.SubmitChanges(); // 1
,这里一切都很好。但是。你看到dataContext.SubmitChanges(); // 2
了吗。它被称为。与XExceptionEvent一起,它将order
的不需要的更改提交到我的数据库。
好的。我尝试为异常创建另一个XDataContext
。但exceptionsDataContext.SubmitChanges();
表示currentUser
是通过不同的XDataContext
加载的。有什么想法吗?有什么优雅的方法可以取消我的order
的无效更改吗?
您的TransactionScope
确保范围内的所有数据库操作都写入数据库,或者根本不写入。
它不会以任何方式影响对内存中对象(包括order
)的更改。
一个简单的解决方案是放弃当前使用的DataContext,并实例化一个新的DataContext(假设可以放弃对实体的未保存更改)。
对于其他选项,请查看相关的
如何拒绝Linq对SQL';s DataContext?
特别是
http://graemehill.ca/discard-changes-in-linq-to-sql-datacontext/
LINQ to SQL DataContext为管理数据库的一组本地更改提供了出色的功能,只需调用SubmitChanges()即可将这些更改推送到服务器。不可避免地,在某些情况下,您希望放弃所做的更改,从而有效地允许您继续使用DataContext,就好像从未进行过这些更改一样。遗憾的是,没有DataContext.DiscardChanges()方法。一些研究表明,这是经过设计的,在这些情况下,您应该简单地重新创建DataContext,但当然,没有什么是那么简单的。现在,来自原始DataContext的每个对象都需要重置,以使用新对象来保证可预测的行为。