【问题标题】:Entity Framework Optimistic Concurrency with Update stored procedure (Julie Lerman example)Entity Framework Optimistic Concurrency with Update 存储过程(Julie Lerman 示例)
【发布时间】:2013-04-20 12:27:11
【问题描述】:

我在理解使用更新存储过程的并发问题时遇到了一些困难。我正在关注 Julie Lerman 的 Programming Entity Framework,她在示例中给出了以下代码:

using (var context = new BAEntities())
        {
            var payment = context.Payments.First();
            if (payment.PaymentDate != null)
            {
                payment.PaymentDate = payment.PaymentDate.Value.AddDays(1);
            }
            var origRowVersion = payment.RowVersion;
            try
            { //BREAKPOINT #1
                context.SaveChanges();
                var newRowVersion = payment.RowVersion;
                if (newRowVersion == origRowVersion)
                {
                    Console.WriteLine("RowVersion not updated");
                }
                else
                {
                    Console.WriteLine("RowVersion updated");
                }
            }
            catch (OptimisticConcurrencyException)
            {
                Console.WriteLine("Concurrency Exception was thrown");
            }
        }

更新 SP 如下所示:

UPDATE payments
SET paymentdate=@date,reservationID=@reservationID,amount=@amount, modifieddate=@modifiedDate
WHERE
paymentid=@paymentid AND ROWVERSION=@rowversion 
IF @@ROWCOUNT>0
SELECT RowVersion AS newTimeStamp FROM payments WHERE paymentid=@paymentid

并且在映射中勾选了“使用原始值”复选框,如下所示: https://dl.dropboxusercontent.com/u/135754/updatemapping.png

现在,当我尝试:

  1. 按原样运行代码,然后在调试器中检查的newRowVersion与origRowversion相同,但应用程序进入'else'子句(为什么它首先相同,我刚刚更改它?是调试器问题吗?)

  2. 运行代码,但在 BREAKPOINT #1 我更新 Management Studio 中的支付对象时,SaveChanges 引发 OptimisticConcurrencyException。我认为这是预期的结果。

每次查看 SQL Profiler 时,都会将原始版本的时间戳发送到服务器。

然后,当我在时间戳值的 SP 映射中取消选中“使用原始值”时,一切都以与上述相同的方式工作......我不明白它。我测试错了吗?应用什么时候应该输入 'if' 子句?

提前致谢,干杯!

编辑: 我添加了 newTimeStamp 作为更新 SP 映射的返回值。现在我可以看到 RowVersion 的更新值是从数据库中正确获取的。但是我仍然看不出选中和未选中“使用原始值”之间的区别......

【问题讨论】:

    标签: stored-procedures entity-framework-5 updating optimistic-concurrency


    【解决方案1】:

    我想我现在明白了。 当我尝试在调用 savechanges 之前手动更改 rowversion(随机字节 [])时:

    1. 未选中使用原始值:“随机字节[]”被发送到数据库并用于更新存储过程(在 WHERE 子句中),导致 OptimisticConcurrencyException
    2. 选中使用原始值:rowversion 最初从 DB 下载时的值被发送并用于更新存储过程(在 WHERE 子句中)

    我想这就是 Use Original Value 的用途……我觉得有点奇怪,谁会在同一个 dbcontext 中手动更改它?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2016-03-15
      • 1970-01-01
      相关资源
      最近更新 更多