我有A和B类的映射,其中'one'侧是A,'many'侧是B. B引用A,其中外键不可为空。使用FluentNH将A映射为B的Cascade.Delete()。当我尝试删除A时,NHibernate尝试更新B并将外键设置为null。所以当外键不可为空时会发生错误。
我该怎么办?使外键可以为空?
编辑:当我将外键设置为可空时,它可以工作。但这是正确的方法吗?
答案 0 :(得分:4)
我遇到的另一个解决方案如下:
HasMany(a => a.B).Cascade.AllDeleteOrphan().Inverse();
如果你想让a.B.Clear()删除所有B,你需要DeleteOrphan。
编辑:因为你只是级联删除,所以这里只是删除:
HasMany(a => a.B).Cascade.Delete().Inverse();
逆属性表示对于从A到B的关系,它是拥有该关系的A(即B)的倒数(它在数据库中具有FK)。您可以阅读有关反Inverse Attribute in NHibernate
的更多信息答案 1 :(得分:1)
这是因为NHibernate尝试将记录上的外键列设置为null,但是由于您不允许该列中的空值,因此数据库服务器会抛出错误。尝试使用.Cascade.AllDeleteOrphan()而不是Cascade.Delete():
在A映射类中:
HasMany(x => x.B)
.Inverse()
.Cascade.AllDeleteOrphan()
.KeyColumn("foreignKeyID");
答案 2 :(得分:0)
如果没有项目背景,很难回答这个问题。
在问题域中,让B没有A?
是否有效如果是这样,外键可以为空。
如果没有,你需要找到一种方法来删除它的父A被删除时的所有B。