Исключение оптимистического параллелизма Entity Framework не возникает

У нас есть приложение ASP.Net MVC, которое использует EF4 в качестве уровня доступа к данным, и мы видим неожиданное поведение в отношении того, что исключения 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, мы видим, что версия используется в предложении where, но используется значение версии thirdEntities (текущее значение в базе данных), а не значения firstEntities. явно устанавливается непосредственно перед вызовом SaveChanges. SaveChanges сбрасывает версию как полученное значение, а не заданное значение.

В EDMX для версии установлено значение StoreGeneratedPattern, равное Computed.

Кто-нибудь знает, что здесь происходит?

6
задан Colin Desmond 16 March 2011 в 16:32
поделиться