Я хочу обновить строку в 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 '
Ваша сущность 'Case', безусловно, имеет свойство' RowVersion', это используется для проверки параллелизма. Но когда вы создаете 'Case' с' new', это свойство *** не имеет *** исходного значения, которое в настоящее время хранится в базе данных.Таким образом, условие WHERE не удалось, вы должны вручную установить исходные значения для 'RowVersion' с некоторым значением, полученным из базы данных, до вызова' SaveChanges() '. – Hopeless
'dbContext.Cases.Add (newCase)' (это новый объект, а не существующий) –
Вы пытаетесь обновить объект, который не существует в базе данных. – trailmax