Обновление структуры сущностей завершается неудачно, когда объект связан с отсутствующим дочерним элементом - PullRequest
1 голос
/ 26 июня 2009

У меня возникают проблемы при обновлении дочернего объекта, когда у объекта есть ссылка на несуществующую дочернюю запись. например. Столы Car и CarColor имеют отношения. Car.CarColorId >> CarColor.CarColorId Если я загружу машину с ее цветной записью, вот так

 var result = from x in database.Car.Include("CarColor")
              where x.CarId = 5
              select x;

Я верну объект "Автомобиль" и его объект "Цвет". Теперь предположим, что некоторое время назад CarColor был удален, но рассматриваемая запись Car по-прежнему содержит значение CarColorId. Поэтому, когда я запускаю запрос, объект Color становится пустым, потому что запись CarColor не существует. Моя проблема здесь в том, что когда я прикрепляю другой существующий объект Color, я получаю обновление Store, вставляю ошибку при сохранении.

Car.Color = newColor
Database.SaveChanges();

Это похоже на то, что контекст пытается удалить несуществующий цвет. Как я могу обойти это?

Ответы [ 3 ]

0 голосов
/ 11 июля 2009

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

Но я думаю, что правильный ответ здесь - исправить нарушения. Они должны быть удалены или исправлены в базе данных. Во-первых, наличие правильных отношений FK с действиями обновления и удаления целостности предотвратило бы это в первую очередь.

0 голосов
/ 27 августа 2009

Не EF применяет ограничения, а база данных, поэтому вы получаете сообщение об ошибке, когда пытаетесь его сохранить. Единственный способ (насколько я знаю) - быть уверенным, что ребенок существует. Вам следует установить соответствующее ограничение внешнего ключа в вашей базе данных между таблицей Car и CarColor.

0 голосов
/ 02 июля 2009

ок, ничего себе - я просто потратил 40 минут, пытаясь обойти это, и я не мог ... не напрямую, во всяком случае. Кажется, нет способа установить Entity Framework, чтобы не применять ограничение отношений.

В какой-то степени вам придется опуститься до "голого" sql. Так что я бы сделал в вашей ситуации создание sql-представления с автомобилями, которые ссылаются на действительные цвета автомобилей (подсчет подзапросов или что-то подобное) и загружаем автомобили с действительными ссылками цветов оттуда.

Если вы хотите установить цвет для автомобиля, который НЕ имеет допустимого цвета, загрузите автомобиль, но без функции Include (), и установите объект цвета напрямую.

...