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

一对多关系中的NHibernate删除问题,nhibernate,fluent-nhibernate,one-to-many,cascade,Nhibernate,Fluent Nhibernate,One To Many,Cascade,我有A和B类的映射,其中“一”面是A,“多”面是B。B引用外键不可为null的A。使用FluentNH将B的集合映射为Cascade.Delete()。当我尝试删除A时,NHibernate尝试更新B并将外键设置为null。所以当外键不可为空时会发生错误 我该怎么办?使外键为空 编辑:当我将外键设置为nullable时,它可以工作。但这是正确的方法吗?如果没有项目上下文,很难回答这个问题 在问题域中,有一个没有a的B有效吗 如果是这样,外键可以为空 如果没有,您需要找到一种方法,在删除父项a时删

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

我该怎么办?使外键为空


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

如果没有项目上下文,很难回答这个问题

在问题域中,有一个没有a的B有效吗

如果是这样,外键可以为空


如果没有,您需要找到一种方法,在删除父项a时删除所有B。

这是因为NHibernate试图将记录上的外键列设置为null,但是由于您不允许该列为null,数据库服务器会抛出错误。尝试使用.Cascade.AllDeleteOrphan()而不是Cascade.Delete():

在映射类中:

HasMany(x => x.B)
        .Inverse()
        .Cascade.AllDeleteOrphan()
        .KeyColumn("foreignKeyID");

我遇到的另一个解决方案是:

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的内容

我认为您的解决方案会起作用,但因为inverse(),而不是AllDeleteOrphan()。我用Cascade.Delete()试过了,效果很好。