关键多对一和关键房地产协会:nhibernate赢得';不要从集合中删除项目

关键多对一和关键房地产协会:nhibernate赢得';不要从集合中删除项目,nhibernate,fluent-nhibernate,composite-id,Nhibernate,Fluent Nhibernate,Composite Id,我会尽量保持简洁,但希望不会错过任何重要的信息在我的麻烦。我相信代码提供了所有细节,但我忽略了噪音(它是VB,所以有很多噪音:)) “Case”对象有许多“赋值”: 我收到的数据模型与您期望的数据模型相似,只是CaseSignment是一个复合键: table Case CaseId uniqueid not null primary key ... table CaseAssignment CaseId uniqueid not null RoleId uniquei

我会尽量保持简洁,但希望不会错过任何重要的信息在我的麻烦。我相信代码提供了所有细节,但我忽略了噪音(它是VB,所以有很多噪音:))

“Case”对象有许多“赋值”:

我收到的数据模型与您期望的数据模型相似,只是CaseSignment是一个复合键:

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
最后,Fluent 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)
aCase.Assignments.Remove(someAssignment)
someAssignment.Case = Nothing
caseRepository.Save(aCase)
我得到的错误是,“无法删除集合行…无法将值NULL插入到列'CaseId',表'casesassignments';列不允许为NULL。更新失败。 该语句已终止。“这是由于试图发出以下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)
caseRepository.Save(aCase)
aCase.Assignments.Remove(someAssignment)
someAssignment.Case = Nothing
caseRepository.Save(aCase)
错误为“意外的行计数:0;应为:1”,因为NHibernate尝试: 从RoleId=[valid guid]和CaseId=NULL的CaseAssignments中删除


我一直在搜索帖子、论坛以及NHibernate和Hibernate文档,但还没有发现任何类似的东西。希望是简单的事情。感谢所有尝试过这个的人

几天前我也有同样的问题。解决方案是将CaseMapping类中的casesassignment集合的“inverse”属性设置为“true”。像这样:

HasMany(Function(x) x.Assignments).KeyColumn("CaseId").Cascade.AllDeleteOrphan().Inverse()
据我所知,您必须将AllDeleteOrphan级联类型和Inverse属性都设置为true才能工作


我希望它能起作用

Groxx也是如此,但对于使用非复合键的更简单的情况。