我一直在努力解决相对简单的问题:
在父类我映射:
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"在孩子中为空。
答案 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)事件,这是无效的,但有时候有一个更好/更合理的代码库胜过这个。显然,在这种情况下,你也只能通过他们的父母来接待孩子。