Проблема удаления NHibernate в отношениях один-ко-многим

У меня есть сопоставление для классов A и B, где «одна» сторона - это A, а сторона «многие» - это B. B ссылается на A, где внешний ключ не допускает значения NULL. Отображение A, установленного как Cascade.Delete () для B с помощью FluentNH. Когда я пытаюсь удалить A, NHibernate пытается обновить B и установить для внешнего ключа значение null. Таким образом, возникает ошибка, поскольку внешний ключ не имеет значения NULL.

Что я должен делать? Сделать внешний ключ допускающим значение NULL?

РЕДАКТИРОВАТЬ: когда я устанавливаю внешний ключ на значение NULL, он работает. Но правильный ли это путь?


person rovsen    schedule 26.11.2010    source источник


Ответы (3)


Еще одно решение, с которым я столкнулся, заключается в следующем:

HasMany(a => a.B).Cascade.AllDeleteOrphan().Inverse();

Вам понадобится DeleteOrphan, если вы хотите, чтобы a.B.Clear () удаляла все B.

РЕДАКТИРОВАТЬ: Поскольку вы выполняете только каскадное удаление, здесь оно предназначено для простого удаления:

HasMany(a => a.B).Cascade.Delete().Inverse();

Обратный атрибут говорит, что для отношения от A к B это обратный к A (то есть B), который владеет отношением (у него есть FK в базе данных). Вы можете узнать больше об обратном обратном атрибуте в NHibernate

person Iain    schedule 27.11.2010

Это связано с тем, что NHibernate пытается установить для столбца внешнего ключа в записях значение NULL, однако, поскольку вы не допускаете значения NULL в этом столбце, сервер базы данных выдает ошибку. Попробуйте использовать .Cascade.AllDeleteOrphan () вместо Cascade.Delete ():

В классе сопоставления A:

HasMany(x => x.B)
        .Inverse()
        .Cascade.AllDeleteOrphan()
        .KeyColumn("foreignKeyID");
person Denis Ivin    schedule 27.11.2010
comment
Думаю, ваше решение сработает, но из-за Inverse (), а не AllDeleteOrphan (). Я пробовал это с помощью Cascade.Delete (), и он работает. - person Iain; 27.11.2010

На этот вопрос сложно ответить без контекста предмета.

Допустимо ли в проблемной области иметь B, у которого нет A?

Если это так, внешний ключ может иметь значение NULL.

Если нет, вам нужно найти способ удалить все B при удалении родительского элемента A.

person Wysawyg    schedule 27.11.2010