Сопоставление ключ-многие-к-одному и свойство-ключ: nhibernate не удаляет элементы из набора
Я постараюсь сохранить это вкратце, но, надеюсь, не упущу ни одной важной информации из моих неприятностей. Код, который я считаю, предоставляет все детали, но я не учел шум (это VB, поэтому много шума:)).
Объект "Case" имеет много "Назначений":
Public Class Case
Property CaseId As Guid
Property Assignments As ISet(Of CaseAssignment)
End Class
Public Class CaseAssignment
Property Case As Case
Property RoleId As Guid
End Class
Модель данных, которую мне передали, выглядит примерно так, как вы ожидаете, за исключением того, что CaseAssignment является составным ключом:
table Case
CaseId uniqueid not null primary key
...
table CaseAssignment
CaseId uniqueid not null
RoleId uniqueid not null
PK := (CaseId, RoleId)
FK from CaseId -> Case.CaseId
Наконец, беглые отображения NHibernate:
Class CaseMapping
Public Sub New()
Table("Case")
KeyColumn("CaseId")
HasMany(Function(x) x.Assignments).KeyColumn("CaseId").Cascade.AllDeleteOrphan()
End Class
Class CaseAssignmentMapping
Public Sub New()
Table("CaseAssignment")
CompositeId() _
.KeyReference(Function(x) x.Case, "CaseId") _
.KeyProperty(Function(x) x.RoleId)
End Class
KeyReference коррелирует с "ключ-многие-к-одному" в языковой таблице XML.
Когда я добавляю назначения к делу, все хорошо, но когда я удаляю ссылки, я получаю одну из двух проблем. С этим кодом:
aCase.Assignments.Remove(someAssignment)
caseRepository.Save(aCase)
Я получаю сообщение об ошибке: "Не удалось удалить строки коллекции... Невозможно вставить значение NULL в столбец" CaseId ", таблица" CaseAssignments "; столбец не допускает пустых значений. UPDATE не выполняется. Оператор завершен". Это было из-за попытки выдать следующий SQL:
UPDATE CaseAssignments SET CaseId = null
WHERE CaseId = @p0 AND RoleId = @p1 AND CaseId = @p2
@p0=[valid guid #1],
@p1=[valid guid #2],
@p2=[valid guid #1 again] **!?!**
Так что это немного запутано. Поэтому я пытаюсь этот код:
aCase.Assignments.Remove(someAssignment)
someAssignment.Case = Nothing
caseRepository.Save(aCase)
и ошибка "Неожиданное количество строк: 0; ожидаемое: 1", потому что NHibernate попытался: УДАЛИТЬ ИЗ CaseAssignments ГДЕ RoleId = [действительный guid] И CaseId = NULL
Я обыскивал темы и форумы, а также документы NHibernate и Hibernate и пока не сталкивался ни с чем подобным. Надеюсь, это что-то простое. Спасибо всем, кто делает снимок в этом!
1 ответ
У меня была такая же проблема несколько дней назад. Решение состоит в том, чтобы присвоить атрибуту "инверсия" значение "true" в вашей коллекции CaseAssignments в вашем классе CaseMapping. Как это:
HasMany(Function(x) x.Assignments).KeyColumn("CaseId").Cascade.AllDeleteOrphan().Inverse()
Насколько я знаю, вы должны иметь как каскадный тип AllDeleteOrphan, так и свойство Inverse, равное true, чтобы это работало.
Надеюсь это работает!