我在使用更新存储过程理解并发问题时遇到了一些困难。我正在关注 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
现在,当我尝试:
按原样运行代码,然后在调试器中检查的 newRowVersion 与 origRowversion 相同,但应用程序进入 'else' 子句(为什么它首先相同,我刚刚更改它?是调试器问题吗?)
运行代码,但在 BREAKPOINT #1 我更新 Management Studio 中的支付对象时,SaveChanges 抛出 OptimisticConcurrencyException。我认为这是预期的结果。
每次我查看 SQL Profiler 时,都会将原始版本的时间戳发送到服务器。
然后,当我在时间戳值的 SP 映射中取消选中“使用原始值”时,一切都以与上述相同的方式工作......我不明白这一点。我测试错了吗?应用程序什么时候应该输入“if”子句?
提前感谢,干杯!
编辑:我添加了 newTimeStamp 作为更新 SP 映射的返回值。现在我可以看到 RowVersion 的更新值是从数据库中正确获取的。但我仍然看不出选中和未选中“使用原始值”之间的区别......