Сбой обновления Entity Framework для объекта с идентификатором 0 - PullRequest
1 голос
/ 30 сентября 2019

Используя Entity Framework Core 3.0 и сталкиваясь со странной проблемой, когда EF выдает исключение, если я пытаюсь обновить сущность с ID = 0, он думает, что ID = 0 является временным значением. Тот же код обновляет сущность с ID = 1 или выше без каких-либо проблем.

Исключение:

InvalidOperationException: свойство 'Id' для типа сущности 'MyType' имеет временное значение при попыткеизменить состояние объекта на «Изменено». Либо задайте постоянное значение в явном виде, либо убедитесь, что база данных настроена на создание значений для этого свойства.

Исключение вызвано следующим оператором:

_context.Attach(MyType).State = EntityState.Modified;

Я нехотите заново заполнить все мои таблицы, чтобы начать с 1.

Это ожидаемое поведение с EF? Должна быть возможность сохранять объекты с ID = 0.

Любой совет, как решить эту проблему?

Спасибо.

1 Ответ

1 голос
/ 30 сентября 2019

У вас есть , чтобы что-то сделать с этим нулевым ID значением. Это бомба замедленного действия.

Вы всегда должны быть начеку, потому что это определенно ожидаемое поведение. EF имеет внутреннюю логику в зависимости от ключевых значений по умолчанию. В EF6 вы могли сделать это, потому что это было менее изысканным. (В этой области).

Позвольте мне показать вам, как оставление этого значения идентификатора может иметь неприятные последствия в будущем.

У вас есть этот MyType объект,Давайте назовем это entity, чтобы следовать некоторым соглашениям / привычкам именования. Его значение идентификатора - 0, и оно не привязано к контексту.

Теперь предположим, что вы не используете этот довольно избыточный способ присоединить его как измененный, а новый способ EF-core:

context.Update(entity);

Теперь вы не увидите никаких исключений, но нет, проблема не устранена. Стало хуже. Состояние объекта entity теперь равно Added, и вы собираетесь добавить новую запись в вашу таблицу. Это может даже остаться незамеченным какое-то время, добавив к куче беспорядка, который вы должны будете убрать позже.

Если бы его значение ID было > 0, метод EF Update сделал бы вывод, что это существующийобъект и его состояние должны быть Modified.

Вы можете установить entity состояние Modified, если (1) оно не подключено и (2) вы используете .. .

context.Entry(entity).State = EntityState.Modified;

И это еще одна бомба замедленного действия. Более поздние изменения кода удаляют первое условие (оно не прикреплено) и бум.

...