Маркировка свойства навигации, измененная в Entity Framework 7

entity-framework-core

Вопрос

У меня есть DbContext DbContext с отключенным отслеживанием изменений, потому что я хочу явно отметить все изменения:

var entry = context.Entry(changedEntity);
entry.Property(propertyName).IsModified = true;

Это работает так, как я хочу.

Однако это не работает, когда ссылка (свойство навигации) обновлена.

Например, предположим, что моя сущность имеет два свойства - ParentId и Parent где ParentId является внешним ключом, а Parent - ссылка на родительский объект.

призвание

entry.Property("Parent").IsModified = true;

не работает и выбрасывает ModelItemNotFoundException потому что Parent не является свойством объекта с точки зрения EF (это вместо этого навигация).

В EF6 это можно сделать следующим образом:

var reference = context.Entry(changedEntity).Reference("Parent");
reference.CurrentValue = reference.CurrentValue;

В EF7 такой функции нет. Я могу добраться до объекта INavigation с помощью

entry.Metadata.GetNavigation("Parent")

но не видит никакого способа отметить его как измененный.

Итак, как мне это сделать?

Примечание. Я знаю, что настройка ParentId будет работать, но для меня это не подходит, потому что связанный объект еще не имеет идентификатора, поскольку он только что был создан, и получит его идентификатор из базы данных при сохранении. Таким образом, мне нужно установить его через ссылку « Parent .

Редактировать:

Примечание выше было верно для EF6, но больше недействительно для EF7, о котором я не знал. Таким образом, решение так же, как описано в примечании и ответе ниже.

Принятый ответ

Ничего себе, похоже, что когда новый объект привязан к DbContext , он фактически получает ID (-1 в моем случае). Таким образом, я могу установить ParentId даже когда целевой объект является новым и еще не добавлен в базу данных.

Интересно, есть ли какие-либо проверки того, что новый идентификатор уникален (в базе уже может быть запись с идентификатором -1).



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему