关键多对一和关键房地产协会:nhibernate赢得';不要从集合中删除项目
我会尽量保持简洁,但希望不会错过任何重要的信息在我的麻烦。我相信代码提供了所有细节,但我忽略了噪音(它是VB,所以有很多噪音:)) “Case”对象有许多“赋值”: 我收到的数据模型与您期望的数据模型相似,只是CaseSignment是一个复合键:关键多对一和关键房地产协会: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
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也是如此,但对于使用非复合键的更简单的情况。