Сопоставление ключ-многие-к-одному и свойство-ключ: 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, чтобы это работало.

Надеюсь это работает!

Другие вопросы по тегам