Я работаю с 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.
Я надеюсь, что я был достаточно ясен. Если нет, пожалуйста, дайте мне знать.