Entity Framework / .Net 4.0: POCO и сохранение нескольких связей - PullRequest
1 голос
/ 27 октября 2009

Как мне настроить свойство, чтобы при использовании SaveChanges сохранялось отношение «многие к одному», и я не получал оператор: INSERT, конфликтующий с ошибкой ограничения FOREIGN KEY ....

Довольно просто, у меня есть Ad и AdType, где много объявлений для одного AdType. В объявлении есть недвижимость:

public class Ad
{
   public Int32 AdTypeId { get; set; }
   public virtual AdType AdType { get; set; }
}

Для покрытия этих отношений.

Когда я делаю это:

someAd.AdType = someAdType;

Свойство установлено просто отлично, а AdTypeId - нет. Не беспокойтесь, так как я предполагаю, что это будет нормально, чтобы сохранить.

context.SaveChanges();

Проблема в том, что на данный момент он пытается сохранить значение 0 в столбце AdTypeId (вызывая проблему внешнего ключа) вместо использования объекта, которому присвоено свойство AdType, чтобы выяснить, что он должен вставить в столбец AdTypeId.

Вещи, которые я знаю:

  • На данный момент someAdType сохранен / имеет идентификатор.
  • Свойство AdType установлено правильно.
  • AdTypeId равен 0.
  • В базе данных существует отношение внешнего ключа.
  • AdTypeId - это первичный ключ.
  • Для отложенной / отложенной загрузки установлено значение true

На самом деле я не пытался изменить AdType, так как он настроен на ленивую загрузку.

1 Ответ

4 голосов
/ 27 октября 2009

Хорошо, похоже, потому что я использую не-прокси (Сделал это слово ... Да) подход «Отслеживание изменений на основе снимка», система не имеет ни малейшего представления, что он изменился.

В этом примере Клиент является чистым Тип POCO. В отличие от EntityObject или IPOCO предприятия, вносящие изменения к сущности не автоматически держать государственного менеджера в синхронизации, потому что нет автоматического уведомления между вашими чистыми сущностями POCO и Entity Framework. Поэтому при запрашивая государственного менеджера, он думает что состояние объекта клиента Без изменений, хотя у нас есть явно внес изменения в один из свойства объекта.

Получил это отсюда

Поэтому, чтобы убедиться, что он знает, чтобы проверить, не произошло ли изменение, я должен использовать опцию AcceptAllChangesAfterSave с методом SaveChanges.

context.SaveChanges(System.Data.Objects.SaveOptions.AcceptAllChangesAfterSave);

И это работает. Надеюсь, я правильно понимаю ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...