Подтвердить что ты не робот

Entity Framework: нарушение ограничений ссылочной целостности во многих отношениях

Привет, у меня есть приложение с кучей кэширования inproc и фреймворка сущности. Когда я хочу написать обновление для объекта, я снова привяжу кешированную копию. Я отслеживаю все, что я приложил в жизненном цикле контекста, поэтому я не пытаюсь прикрепить их дважды.

У меня есть ошибка, возникающая при подключении (очень редко в большинстве случаев это работает отлично и очень быстро), в котором говорится следующее:

Нарушение ограничения ссылочной целостности произошло: свойство значения, определяющие ссылочные ограничения, несовместимы между главными и зависимыми объектами в отношении.

Я внимательно посмотрел на сущность, которая выглядит нормально. Я думаю, что эта проблема связана с вложением/отсоединением внешнего ключа при запуске fixups.

Есть ли хороший способ получить дополнительную информацию об этой ошибке или может произойти по другим причинам, кроме того, что объект находился в состоянии, которое EF не ожидало?

EDIT: DB Diagram (обратите внимание, что я использую codefirst Я просто использовал инструмент EDMX для создания диаграммы, я также нарезал кучу обычных свойств с модели для простоты)

enter image description here

4b9b3361

Ответ 1

Ошибка может произойти для отношения "один ко многим" между Person и Location, которое вы, по-видимому, имеете в вашей модели, в дополнение к отношениям "многие ко многим" . Например, следующий код генерирует исключение:

using (var context = new MyContext())
{
    var person = new Person
    {
        CurrentLocationId = 1,
        CurrentLocation = new Location { Id = 2 }
    };
    context.People.Attach(person); // Exception
}

"Значения свойств, определяющие ссылочные ограничения", являются значением свойства внешнего ключа CurrentLocationId и значением первичного ключа CurrentLocation.Id. Если эти значения отличаются друг от друга, генерируется исключение. (Имея CurrentLocation как null, хотя это разрешено.)

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

Ответ 2

Я только что столкнулся с той же проблемой, и мое решение заключалось в том, что я добавил сопоставления в ассоциацию, а затем установил ссылочные ограничения.

Чтобы решить проблему, мне пришлось открыть окно сопоставлений для связи, и была ссылка на удаление сопоставлений. После того, как вы сделали окно "Сведения о карте", тогда указанные сопоставления не допускаются. Похоже, что добавление ссылочного ограничения оставляет любые сопоставления на месте.

Думал, что это может стоить публикации, если кто-то еще ищет решения для этого сообщения об ошибке в будущем.

Ответ 3

@LukeMcGregor привет,

Я думаю, что я могу предложить другую точку зрения, как тот, кто имеет ту же проблему.

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

Потому что в моем сценарии: я хотел включить объект, который вызвал ошибку несоответствия. Это объект местоположения в вашем сценарии. Если я добавлю объект с идентификатором, я получаю эту ошибку, потому что идентификатор в предыдущем объекте (тот, который не обновлен) не соответствует обновленному идентификатору.

Но это не большая проблема. В качестве решения; Если он все еще находится на стороне пользовательского интерфейса, объект все равно может быть включен, если он все еще существует.

Вы либо опорожняете объект, когда получаете запрос на обновление от пользователя. (= Null). Или вы обновите объект с идентификатором, обновленным пользователем перед обновлением на стороне службы (добавьте, измените... что угодно) и обновите его таким образом.

Что это. Он может оставаться таким же, как в базе данных и диаграммах.