不能用父母的身份保存孩子

时间:2016-08-27 00:57:22

标签: c# .net nhibernate fluent-nhibernate

我一直在努力解决相对简单的问题:

在父类我映射:

HasMany(x => x.States)
         .KeyColumn("WorkflowOid")
         .Inverse()
         .Cascade.All()
         .Not.LazyLoad();

数据库在子表中包含WorkflowOid列。

在子映射类中:

References(x => x.Workflow)
         .Column("WorkflowOid");

在" States"中考虑具有状态的新Workflow对象。 list,有没有办法自动识别父项是工作流对象,而不必设置"工作流"孩子变量?

我的意思是,当我使用没有将Workflow变量设置为父实例的State保存Workflow对象时,会导致列" WorkflowOid"在孩子中为空。

1 个答案:

答案 0 :(得分:1)

不是您当前映射的方式。您将父关系映射为Inverse(),这意味着它不负责保存子对象上的关系。

你确实有一个Cascade.All()集,但父母只是在孩子身上调用SaveOrUpdate(),孩子没有父集,所以它为WorkflowOid保存null来自它的null Workflow属性。

以下是解决此问题的一些方法:

1)在名为AddState(State state)的父级上设置一个方法,当您调用它时,请将其设置为state.Workflow = this并将其添加到States集合中。

2)通过删除Inverse()使父级负责保存与子级的关系,并将子级设置为Inverse(),这意味着只保存父级可以写入WorflowOid列

3)从父级移除Inverse(),并且根本不将孩子与父级联系起来,这意味着在新的孩子仅创建(但不是更新)会得到一个Save()(保存孩子)和Update()(向它添加WorkflowOid)事件,这是无效的,但有时候有一个更好/更合理的代码库胜过这个。显然,在这种情况下,你也只能通过他们的父母来接待孩子。