Проблема удаления NHibernate в отношениях один-ко-многим - PullRequest
2 голосов
/ 27 ноября 2010

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

Что мне делать? Сделать внешний ключ обнуляемым?

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

Ответы [ 3 ]

4 голосов
/ 27 ноября 2010

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

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

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

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

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

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

1 голос
/ 27 ноября 2010

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

В классе отображения A:

HasMany(x => x.B)
        .Inverse()
        .Cascade.AllDeleteOrphan()
        .KeyColumn("foreignKeyID");
0 голосов
/ 27 ноября 2010

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

В проблемной области действительно ли иметь B, который не имеет A?

Если это так, внешний ключможет быть обнуляемым.

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

...