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对象处于不一致状态(其StatusXOrderStatus.Completed,但未设置CompletedOn)。没有调用dataContext.SubmitChanges(); // 1,这里一切都很好。但是。你看到dataContext.SubmitChanges(); // 2了吗。它被称为。与XExceptionEvent一起,它将order的不需要的更改提交到我的数据库。

好的。我尝试为异常创建另一个XDataContext。但exceptionsDataContext.SubmitChanges();表示currentUser是通过不同的XDataContext加载的。有什么想法吗?有什么优雅的方法可以取消我的order的无效更改吗?

DataContext.SubmitChanges()提交不需要的数据

您的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的每个对象都需要重置,以使用新对象来保证可预测的行为。