Да, это поведение полностью не работает. Я попробую один обходной путь вечером и дам вам знать.
есть приложение ASP.Net MVC, которое использует EF4 в качестве слоя доступа к данным, и мы наблюдаем неожиданное поведение в отношении исключений OptimisitcConcurrencyException, когда мы думаем, что так и должно быть.
Мы упростили проблему до следующего кода ...
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, мы видим, что в предложении where используется Version, но используется значение Version третьего элемента (текущее в БД), а не значения firstEntities. до вызова SaveChanges. SaveChanges сбрасывает версию, чтобы она была полученным значением, а не установленным значением.
В EDMX для версии установлено, что для StoreGeneratedPattern установлено значение Computed.
Кто-нибудь знает, что здесь происходит?