【问题标题】:Linq to SQL get updated record in transactionLinq to SQL 获取事务中的更新记录
【发布时间】:2012-10-02 06:38:49
【问题描述】:

我是 Linq to Sql 的新手。我有一个场景。我有两张桌子。 MasterTable 和 DetailTable 表。我想做的是:

在 DetailTable 和基于 DetailTable 行的基础上插入新行我正在尝试在一个事务中更新 Master。

这是我的代码:

DBContext context = new DBContext();
context.Connection.Open();
context.Transaction = context.Connection.BeginTransaction();

DetailTable detail = new DetailTable();

detail.Amount = 100;

var detailTable = context.GetTable<DetailTable>();
                // pass in the object with insert on submit
                // and then submit changes
detailTable.InsertOnSubmit(detail);

var result = (from Total in context.MasterTable
select Total).Sum();

decimal total = (decimal)result; // This total is not the latest.

// UpdateMaster.....
// ................

context.SubmitChanges();
context.Transaction.Commit();

现在我面临的问题是我没有从 MasterTable 获得最新的 Sum。就像在插入数量为 100 的新行之后,说我应该得到 600 但我得到了 500(总和行,就好像我没有插入新行一样)。 请让我知道这是否可以使用 Linq to Sql 如果是这样的话,或者我正在尝试实现一些不可能的事情。

【问题讨论】:

    标签: c# asp.net linq linq-to-sql


    【解决方案1】:

    尝试将context.SubmitChanges(); 放在decimal total = (decimal)result; 上方

    【讨论】:

    • 然后事务将被提交。假设如果发生了一些异常,结果会是什么?
    • 我知道 SubmitChanges 是如何工作的。假设我更新了 Detail 并调用了 SubmitChanges 并且在更新 Master 时发生了一些事情。详细更改将保存到数据库中,我的数据将处于错误状态。
    • 我很惊讶 SubmitChanges 在这种情况下工作。但是,如果您将 SubmitChanges 放在 var result = (from Total in context.MasterTable select Total).Sum(); 之前,它会起作用;
    【解决方案2】:

    您的数据上下文中的数据已过时。在您提交更改之前,Linq-2-sql 不会应用挂起的更新。

    所以你需要做的是以下任一:

    decimal total = (decimal)result + detail.amount
    

    或者您确实按照 Jan P. 上面的建议进行操作。这也可以,因为您自己管理事务。

    另外:你为什么要自己打开连接?在这种情况下不需要这样做。

    【讨论】:

    • 这是伪代码人。实际上连接开放代码在 DAL 中。我的 DAL 给出了连接未打开的错误,所以我手动进行了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多