Проходя через профилировщик SQL, я заметил следующий запрос, сгенерированный EF4.
exec sp_executesql N'declare @p int
update [dbo].[User]
set @p = 0
where (([UserID] = @0) and ([RowVersion] = @1))
select [RowVersion]
from [dbo].[User]
where @@ROWCOUNT > 0 and [UserID] = @0',N'@0 int,@1 binary(8)',@0=1,@1=0x000000000042DDCD
Я не уверен, почему EF4 генерирует это, хотя я на самом деле не обновляю никакие столбцы таблицы User в этом UnitOfWork. Выполнение этого запроса обновляет столбец RowVersion (тип данных отметки времени) , что приводит к исключению OptimisticConcurrencyException в следующем UnitOfWork.
Быстрый поиск в Google привел меня к этой ссылке , которая подтверждает, что другие тоже сталкивались с этим сценарием, пока не нашли решения.
Буду очень признателен за любые указатели.
Редактировать: Пример кода для репликации проблемы.
![enter image description here](https://i.stack.imgur.com/Km7ga.png)
Таблицы пользователей и сеансов имеют отношение внешний ключ . Кроме того, в EF4 я установил «Режим параллелизма» для столбцов RowVersion обоих объектов на Исправлено .
Ниже приведен пример метода для репликации сценария.
private static void UpdateSession()
{
using (var context = new TestEntities())
{
context.ContextOptions.ProxyCreationEnabled = false;
var session = context.Users.Include("Sessions").First().Sessions.First();
session.LastActivityTime = DateTime.Now;
context.ApplyCurrentValues("Sessions", session);
context.SaveChanges();
}
}
Я вижу из Sql profiler следующие запросы, генерируемые EF4.
exec sp_executesql N'update [dbo].[Session]
set [LastActivityTime] = @0
where (([SessionID] = @1) and ([RowVersion] = @2))
select [RowVersion]
from [dbo].[Session]
where @@ROWCOUNT > 0 and [SessionID] = @1',N'@0 datetime2(7),@1 int,@2 binary(8)',@0='2011-06-20 09:43:30.6919628',@1=1,@2=0x00000000000007D7
А следующий запрос странный.
exec sp_executesql N'declare @p int
update [dbo].[User]
set @p = 0
where (([UserID] = @0) and ([RowVersion] = @1))
select [RowVersion]
from [dbo].[User]
where @@ROWCOUNT > 0 and [UserID] = @0',N'@0 int,@1 binary(8)',@0=1,@1=0x00000000000007D3