我有映射的A和B类,其中'一边是A和'很多'一边是B. B引用A外键不可为空。使用FluentNH将集合映射为B的Cascade.Delete()。当我尝试删除A时,NHibernate尝试更新B并将外键设置为null。所以错误发生,因为外键不可为空。NHibernate删除问题的一对多关系
我该怎么办?使外键可以为空?
编辑:当我设置可以为空的外键它的作品。但这是否正确?
我有映射的A和B类,其中'一边是A和'很多'一边是B. B引用A外键不可为空。使用FluentNH将集合映射为B的Cascade.Delete()。当我尝试删除A时,NHibernate尝试更新B并将外键设置为null。所以错误发生,因为外键不可为空。NHibernate删除问题的一对多关系
我该怎么办?使外键可以为空?
编辑:当我设置可以为空的外键它的作品。但这是否正确?
另一种解决方案,我碰到如下:
HasMany(a => a.B).Cascade.AllDeleteOrphan().Inverse();
如果您希望aBClear()删除所有B,则需要DeleteOrphan。
编辑:由于您只级联删除,这是直接删除:
HasMany(a => a.B).Cascade.Delete().Inverse();
逆属性是说,从A到B的关系,它是A(即B的逆)拥有该关系(它在数据库中具有FK)。你可以阅读更多关于逆Inverse Attribute in NHibernate
如果没有项目上下文,很难回答这个问题。
在问题域中,是否有一个B没有A?
如果是这样,外键可以是空的。
如果不是,您需要找到一种方法来删除所有的B当它的父A被删除。
这是因为NHibernate尝试将记录上的外键列设置为null,但是由于您不允许该列中的空值,因此数据库服务器会引发错误。尝试使用.Cascade.AllDeleteOrphan()代替Cascade.Delete():
在映射类:
HasMany(x => x.B)
.Inverse()
.Cascade.AllDeleteOrphan()
.KeyColumn("foreignKeyID");
我认为你的解决方案将工作,但由于Inverse(),而不是AllDeleteOrphan()。我试着用Cascade.Delete()试试它。 – Iain 2010-11-27 02:01:42