我正在将现有的* .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的等效映射是什么,以便我的流畅映射具有与.hbm.xml文件完全相同的功能?我认为将Cascade从Fluent映射中删除将是默认行为,但我不确定。
答案 0 :(得分:2)
根据定义,您不能拥有1:1关系中的孤儿,这两个记录必须存在。删除将始终以1:1级联。我不知道为什么XML地图允许这样做。
答案 1 :(得分:1)
最后,我只需要弄清楚出了什么问题并解决了这个问题,无论默认的流畅行为如何。在http://brunoreis.com/tech/fluent-nhibernate-hasone-how-implement-one-to-one-relationship/的帮助下,我能够解决这个问题。
我需要添加.Cascade.All()。但是,我真正需要的是在LineItemAssembly类的映射中关闭HasOne关系的.ForeignKey()。
答案 2 :(得分:1)
现在NHibernate 4.1支持这一功能 - 现在可以正确支持一对一关系船级联“all-delete-orphan”(问题NH-1262已在4.1中修复)。我测试了它并且可以确认它正在工作 - 一旦你将子一对一属性设置为null,它就会为孩子发出sql delete命令。
不幸的是,流利的nhibernate不支持它,因为它最后一次在2015年更新。但是,你可以自己从源代码(https://github.com/jagregory/fluent-nhibernate,How to build Fluent NHibernate?建立流畅的nhibernate;我为此努力一点 - 您需要安装ruby,rubygems,运行InstallGems.bat,手动运行“bundle install”(由于某种原因没有为我执行),并使用“rake”命令构建解决方案。)
然后,您所要做的就是将方法withUpdatedSpeed(speed): Vehicle
从AllDeleteOrphan
类移到CollectionCascadeExpression
类并构建它(您也可以使用visual studio 2010+打开FluentNHibernate.sln来构建它,但你必须至少运行一次“rake”命令。)
自定义构建(由我)FluentNHibernate.dll版本2.0.3.1与HasOne AllDeleteOrphan支持可以从 here