我们有一个使用 EF4 作为其数据访问层的 ASP.Net MVC 应用程序,并且我们看到了与 OptimisitcConcurrencyExceptions 相关的意外行为,而我们认为它们应该不会被抛出。
我们已将问题简化为以下代码...
using System.Linq;
using Project.Model;
namespace OptimisticConcurrency
{
class Program
{
static void Main()
{
Contact firstContact = null;
using (var firstEntities = new ProjectEntities())
{
firstContact = (from c in firstEntities.Contacts
where c.LastName == "smith" select c).Single();
}
using (var secondEntities = new ProjectEntities())
{
var secondContact = (from c in secondEntities.Contacts
where c.LastName == "smith" select c).Single();
secondContact.Title = "a";
secondEntities.SaveChanges();
}
firstContact.Title = "b";
using (var thirdEntities = new ProjectEntities())
{
var thirdContact = (from c in thirdEntities.Contacts
where c.LastName == "smith" select c).Single();
thirdContact.Title = firstContact.Title;
//EXPLICITLY SET VERSION HERE
thirdContact.Version = firstContact.Version;
thirdEntities.SaveChanges();
}
}
}
}
这是我们的 MVC 应用程序中发生的事情的一个相当简单的版本,但是会出现同样的问题。
当我们在第三个实体上调用 SaveChanges 时,我预计会出现异常并且没有抛出任何东西。
更有趣的是,当我们附加 SQL Profiler 时,我们看到 Version 正在 where 子句中使用,但使用的是 thirdEntities 版本值(数据库中的当前值),而不是 firstEntities 值,尽管它被立即显式设置在调用 SaveChanges 之前。SaveChanges 将 Version 重置为检索到的值而不是设置值。
在 EDMX 中,版本设置为将 StoreGeneratedPattern 设置为 Computed。
有人知道这里发生了什么吗?