NHibernate在一对多关系中删除问题

时间:2010-11-26 23:54:29

标签: nhibernate fluent-nhibernate one-to-many cascade

我有A和B类的映射,其中'one'侧是A,'many'侧是B. B引用A,其中外键不可为空。使用FluentNH将A映射为B的Cascade.Delete()。当我尝试删除A时,NHibernate尝试更新B并将外键设置为null。所以当外键不可为空时会发生错误。

我该怎么办?使外键可以为空?

编辑:当我将外键设置为可空时,它可以工作。但这是正确的方法吗?

3 个答案:

答案 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。