0

我在使用更新存储过程理解并发问题时遇到了一些困难。我正在关注 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 的更新值是从数据库中正确获取的。但我仍然看不出选中和未选中“使用原始值”之间的区别......

4

1 回答 1

0

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

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

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

于 2013-04-28T18:59:38.643 回答