2010-11-26 67 views
2

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

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

编辑:当我设置可以为空的外键它的作品。但这是否正确?

回答

4

另一种解决方案,我碰到如下:

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

0

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

在问题域中,是否有一个B没有A?

如果是这样,外键可以是空的。

如果不是,您需要找到一种方法来删除所有的B当它的父A被删除。

1

这是因为NHibernate尝试将记录上的外键列设置为null,但是由于您不允许该列中的空值,因此数据库服务器会引发错误。尝试使用.Cascade.AllDeleteOrphan()代替Cascade.Delete():

在映射类:

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

我认为你的解决方案将工作,但由于Inverse(),而不是AllDeleteOrphan()。我试着用Cascade.Delete()试试它。 – Iain 2010-11-27 02:01:42

相关问题