2015-10-23 2 views
2

У меня есть 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 которых я не знал. Таким образом, решение так же, как описано в примечании и ответе ниже.

ответ

1

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

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

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