4

我正在将现有的 *.hbm.xml 文件更新为流利的 ClassMaps,并且偶然发现了我们的映射文件中的错误,并且我不知道我正确映射它的默认行为。

映射文件有:

<one-to-one name="LineItemAssembly" 
            class="LineItemAssembly" 
            cascade="all-delete-orphan" />

使用 Fluent 时,我希望它映射到:

HasOne<LineItemAssembly>(x => x.LineItemAssembly)
                        .Cascade.AllDeleteOrphan();

但是,AllDeleteOrphan() 不是 Cascade 的选项(并且正确如此)。我知道这是因为它不是一个选项,而是因为它是映射文件中的错误。使用 Fluent 的等效映射是什么,以便我的 fluent 映射具有与 .hbm.xml 文件完全相同的功能?我认为将 Cascade 排除在 Fluent 映射之外将是默认行为,但我不确定。

4

3 回答 3

4

NHibernate 4.1 现在支持这一点 - 现在正确支持一对一关系级联“all-delete-orphan”(问题NH-1262已在 4.1 中修复)。我对此进行了测试并且可以确认它正在工作——一旦你将孩子的一对一属性设置为 null,它就会为孩子发出 sql delete 命令。

不幸的是,fluent nhibernate 不支持它,因为它最后一次更新是在 2015 年。但是,您可以从源代码(https://github.com/jagregory/fluent-nhibernate )自己构建 fluent nhibernate ,如何构建 Fluent NHibernate ? _

然后您所要做的就是将方法AllDeleteOrphanCollectionCascadeExpression一个类移动到CascadeExpression另一个类并构建它(您也可以使用 Visual Studio 2010+ 打开 FluentNHibernate.sln 来构建它,但您必须至少运行一次“rake”命令)。

在此处输入图像描述

自定义构建(由我)FluentNHibernate.dll 版本 2.0.3.1,支持 HasOne AllDeleteOrphan 可以从 这里下载

于 2017-05-17T13:37:17.150 回答
2

您不能在 1:1 关系中拥有孤儿,根据定义,两条记录都必须存在。删除将始终以 1:1 级联。我不知道为什么 XML 地图允许这样做。

于 2012-12-13T18:16:09.620 回答
1

最后,我只需要找出问题所在并修复它,而不管默认的流利行为如何。在http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/的帮助下,我能够解决这个问题。

我需要添加 .Cascade.All()。但是,我真正需要的是在 LineItemAssembly 类的映射中脱离 HasOne 关系的 .ForeignKey()。

于 2012-12-13T20:06:04.980 回答