Entity Framework 4.3 DbContext SaveChanges обновляет больше записей, чем ожидалось - PullRequest
1 голос
/ 29 февраля 2012

Я использую Entity Framework 4.3 и DbContext для обновления моей базы данных. У меня есть коллекция пользователей, которая позволяет любому пользователю быть измененным, а затем сохранить изменения. Моя проблема в том, что я обнаружил, что дополнительная запись неожиданно обновляется при вызове SaveChanges ().

Например, обновление пользователя с pk = 5 до статуса «аннулировано» также генерирует обновление sql для пользователя с pk = 1

Трассировка SQL-профилировщика:

(НЕ ОЖИДАЯ ЭТОГО)

exec sp_executesql N'declare @p int
update [db].[Users]
set @p = 0
where (([UsersPk] = @0) and ([RowVersion] = @1))
select [RowVersion]
from [db].[Users]
where @@ROWCOUNT > 0 and [UsersPk] = @0',N'@0 int,@1 binary(8)',@0=1,@1=0x0000000000011BFD

(ОЖИДАЕМЫЕ)

exec sp_executesql N'update [db].[Users]
set [AccessStatus] = @0
where (([UsersPk] = @1) and ([RowVersion] = @2))
select [RowVersion]
from [db].[Users]
where @@ROWCOUNT > 0 and [UsersPk] = @1',N'@0 varchar(10),@1 int,@2 binary(8)',@0='revoked',@1=5,@2=0x0000000000011C01

Для отладки я использовал это

var mods = DbContext.ChangeTracker.Entries<User>().Where(u => u.State == EntityState.Modified);
Debug.Print(mods.Count().ToString());

для получения количества измененных записей, которое возвращает 1, но вызов SaveChanges () возвращает 2, как и должно быть, так как 2 записи обновляются.

Я не могу понять, почему генерируется первый запрос, поскольку свойства этого пользователя не обновляются - ну, в любом случае, их не должно быть.

Я подозреваю, что упускаю что-то довольно простое здесь, но не могу понять что. Любые предложения с благодарностью.

1 Ответ

1 голос
/ 29 февраля 2012

Это похоже на ошибку в .NET 4, которая будет исправлена ​​в следующем выпуске .NET 4.5 и для которой исправление также доступно в качестве исправления.Ошибка обнаружена в EF 4.3, поскольку она основана на базовых базовых библиотеках .NET 4.

Подробные сведения об исправлении приведены здесь: http://support.microsoft.com/kb/2390624

Вам необходимо связаться с клиентом Microsoft.Сервис и поддержка для получения исправления.Однако, как я уже сказал, ошибка также исправлена ​​в .NET 4.5, которая будет в бета-версии в любой день.

К сожалению, хороших общих решений не существует.

...