У меня есть EF7 DbContext
с ограниченными возможностями отслеживания изменений, потому что я хочу, чтобы пометить все изменения в явном виде:Маркировка навигации собственности, измененный в Entity Framework 7
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
.
Edit:
Нота выше было верно для EF6, но больше не действительны для EF7 которых я не знал. Таким образом, решение так же, как описано в примечании и ответе ниже.