2013-04-21 3 views
6

Я пытаюсь обновить существующий объект.Нарушение ограничения ссылочной целостности

У меня есть следующий код:

public MamConfiguration_V1 Save(MamConfiguration_V1 item) 
{ 
    mMaMDBEntities.MamConfiguration_V1.Attach(item); 
    mMaMDBEntities.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); 
    mMaMDBEntities.SaveChanges(); 
    return item; 
} 

Но Attach метода вызывает исключение:

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

Как это исправить?

ответ

3

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

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

mMaMDBEntities.Entry<MamConfiguration>(item).State = System.Data.EntityState.Modified; 

Вы можете добавить использование System.Data, чтобы избежать необходимости писать все время.

Прикрепите объект в том состоянии, которое вы хотите, изменив в этом случае и отслеживая изменения. Это одна строка вместо двух.

8

Похоже, что у вас есть отношения с полем внешнего ключа и свойство навигации в item, и эти поля имеют противоречивые значения. Это происходит при загрузке объекта и связанных с ним объектов, изменение отношения на одном конце, отметьте только этот конец как Modified и попытайтесь сохранить. Убедитесь, что вы изменяете отношения на обоих концах и отмечаете все затронутые объекты как Modified перед вызовом SaveChanges.

+1

любой простой способ пузырить модифицированный флаг? –

+2

В обычных случаях EF отслеживает изменения самостоятельно, и вы можете просто вызвать «SaveChanges» без ручной установки флага. В отключенном сценарии нет простого способа, но вам придется вручную пометить его как измененный. –

+0

Я получил эту ошибку, даже если для параметра «AutoDetectChangesEnabled» установлено значение true. Мне не нужны связанные объекты, поэтому я их не загружал, и это решило проблему. –

4

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

Исключение было выбрано при вызове IObjectContextAdapter.ObjectContext.AttachTo(entitySetName, entity) с частично загруженным объектом. Были определены внешние ключи на объекте, но навигационные свойства не были загружены. (То есть, O.ItemID имеет значение, но O.Item было null). Конкретные обстоятельства не позволяли загружать O.Item.

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

1

Проблема для меня заключалась в том, что инфраструктура entity загрузила мой объект в несколько мест, поэтому, когда я обновил внешний ключ, теперь были два ссылки на один и тот же объект, один с внешним ключом, указывающий на запись a и один с внешний ключ, указывающий на запись b, что вызвало ошибку, так как мои отношения друг к другу. Чтобы решить эту проблему, я использовал context.Entry (Object) .State = EntityState.Detached, перезагрузил объект, сделал изменение внешнего ключа, а затем сохранил изменения

+0

Спасибо! Это исправило мою проблему. – brady