Entity Framework отключенный график и свойство навигации

Я работаю с Entity Framework 6 Code First и Fluent API. У меня есть отношение «один ко многим» между Visit и VisitPage (1 Visit имеет много объектов VisitPage). Это упрощенная версия классов POCO:

Посещение: идентификатор (удостоверение), URLReferrer, страницы. VisitPage: идентификатор (удостоверение личности), имя, посещение, идентификатор посещения.

Сначала я создаю объект Visit и добавляю к нему объект VisitPage. Затем я вставляю их в БД. До этого момента все работает нормально. Наблюдение: свойство VisitId в VisitPage автоматически устанавливается после вставки (оно берет значение идентификатора из БД и устанавливает свойство).

Затем в отключенном окружении я добавляю в визит новую страницу (я не получаю объект Визит из БД, вот что я имею в виду под отключенным окружением). Эта новая страница ссылается на тот же объект посещения, но я не устанавливаю свойство VisitId, поскольку считаю, что EF должен установить его на основе свойства посещения. И в этом проблема, EF его не устанавливает и, по сути, выдает исключение о том, что значение свойства Visit и свойства VisitId не совпадают. Я ожидал, что EF сможет сделать это под капотом (например, в методе DetectChanges), но это не так.

Сообщение об исключении:

Произошло нарушение ограничения ссылочной целостности: значение свойства "VisitId" на одном конце отношения не соответствует значению свойства "VisitPage.VisitId" на другом конце.

Итак, как мне решить эту проблему? Я вижу два возможных решения: 1) Работа в подключенной среде --> получить объект «Посещение» из EF, а затем добавить объект страницы. В этом случае EF обновляет значение VisitId и работает. 2) Установить VisitId вручную после настройки объекта Visit.

Я надеюсь, что я был достаточно ясен. Если нет, пожалуйста, дайте мне знать.


person Francisco Goldenstein    schedule 29.07.2014    source источник


Ответы (1)


Либо сделайте это

visitPage.VisitId = VisitPage.Visit.Id;
visitPage.Visit = null;

or

context.Visits.Attach(visitPage.Visit);

or

context.Entry(visitPage.Visit).State = EntityState.Unchanged;
person Yuliam Chandra    schedule 30.07.2014
comment
Извините, может я что-то упускаю. 1-й вариант: зачем мне устанавливать для visitPage.Visit значение null? Если я собираюсь быть явным (что-то, чего я не хотел), я бы установил visitPage.VisitId = visitPage.Visit.Id, потому что я уже установил visitPage.Visit = visit; Что касается второго варианта, присоединение установит состояние без изменений, как и предложенный вами третий вариант. После вызова SaveChanged ничего не будет отправлено в БД (без обновления). Вы можете проверить msdn.microsoft.com/en-us/data/jj592676.aspx . Спасибо за ответ, но я надеюсь, что есть лучшее решение. - person Francisco Goldenstein; 30.07.2014