2015-09-23 15 views
5

Я хочу обновить строку в EF:Entity Framework обновление провал

Case newCase = new Case(...); 
dbContext.Entry(newCase).State = EntityState.Modified; 
dbContext.SaveChanges(); 

При обновлении у меня есть это сообщение:

Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded

Там нет параллелизма, так как я использую дб на моем машина.

Если я иду в SQL Profiler, чтобы увидеть запрос, который выполняется, условие:

WHERE [Id] = @ p0 И [RowVersion] = @ p14;

в этом состоянии, @ p0 is = 1 и @ p14 - NULL, точно так же, как запись, которую я хочу изменить. Но если я вручную запустил этот запрос на Sql Server после удаления части запроса RowVersion, он будет успешным, обновив 1 строку.

В чем может быть проблема и как ее решить?

EDIT:

Я попытался выбрать запись только перед обновлением, но ошибка та же:

IEnumerable<Case> cases = from c in dbContext.Cases where c.Id.ToString() == "1" select c; 
    Case cs = cases.SingleOrDefault(); 
    dbContext.Entry(cs).State = EntityState.Modified; 
    dbContext.SaveChanges(); 

Вот полная ошибка:

An exception of type 'Microsoft.Data.Entity.DbUpdateConcurrencyException' occurred in EntityFramework.Core.dll but was not handled in user code

Additional information: Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded. See http://go.microsoft.com/fwlink/?LinkId=527962 for information on understanding and handling optimistic concurrency exceptions.

И здесь является запрос от Sql Profiler:

exec sp_executesql N'SET NOCOUNT OFF; 

UPDATE [Case] ​​SET [Закрыто] = @ p1, [Комментарий] = @ p2, [ContactComment] = @ p3, [ContactId] = @ p4, [CreatedBy] = @ p5, [CreatedDateTime] = @ p6, [ Описание] = @ p7, [Email] = @ p8, [LastModifiedBy] = @ p9, [LastModifiedDateTime] = @ p10, [OpenedDateTime] = @ p11, [Телефон] = @ p12, [RowVersion] = @ p13, [SlaConsumedTime ] = @ p15, [SlaSuspended] = @ p16, [SlaTotalTime] = @ p17, [Status] = @ p18, [Title] = @ p19 WHERE [Id] = @ p0 AND [RowVersion] = @ p14;

SELECT @@ ROWCOUNT; ', N' @ p0 int, @ p1 бит, @ p2 nvarchar (max), @ p3 nvarchar (max), @ p4 int, @ p5 int, @ p6 datetime2 (7), @ p7 nvarchar (4000), @ p8 nvarchar (4000), @ p9 int, @ p10 datetime2 (7), @ p11 datetime2 (7), @ p12 nvarchar (max), @ p13 varbinary (max), @ p14 varbinary (max), @ p15 time (7), @ p16 бит, @ p17 время (7), @ p18 int, @ p19 nvarchar (4000) ', @ p0 = 1, @ p1 = 0, @ p2 = NULL, @ p3 = NULL, @ p4 = 0, @ p5 = 1, @ p6 = '2015-09-23 09: 07: 55.7041023', @ p7 = N'y ', @ p8=N'[email protected]', @ p9 = 1, @ p10 = ' 2015-09-23 09: 50: 02.9934006 ', @ p11 =' 2015-09-23 09: 07: 55.6796028 ', @ p12 = NULL, @ p13 = NULL, @ p14 = NULL, @ p15 = '00: 00 : 00 ', @ p16 = 0, @ p17 = '00: 00: 00', @ p18 = 0, @ p19 = N'y '

+0

Ваша сущность 'Case', безусловно, имеет свойство' RowVersion', это используется для проверки параллелизма. Но когда вы создаете 'Case' с' new', это свойство *** не имеет *** исходного значения, которое в настоящее время хранится в базе данных.Таким образом, условие WHERE не удалось, вы должны вручную установить исходные значения для 'RowVersion' с некоторым значением, полученным из базы данных, до вызова' SaveChanges() '. – Hopeless

+0

'dbContext.Cases.Add (newCase)' (это новый объект, а не существующий) –

+0

Вы пытаетесь обновить объект, который не существует в базе данных. – trailmax

ответ

0

идентификатор объекта основного ключа вашего объекта не установлен .. это означает равна нулю. Когда вы пытаетесь обновить запись, чтобы ее идентификационный ключ должен был установить значение, ID и обновление будут работать. Ваш код обновления в порядке.

+1

Нет идентификатора, так как я сказал, что условие WHERE [Id] = p0 и p0 = 1. – Sean

1

Первоначальный ключ как Null значение LinQ.

Case newCase = new Case(...); 
dbContext.Entry(newCase).State = EntityState.Modified; 
dbContext.SaveChanges(); 

Проверьте объект, проходит ли это первичный ключ Null. Это исключение обычно происходит только по этой причине.

Смежные вопросы