servicestack-text,C#,Nhibernate,Fluent Nhibernate,servicestack Text" /> servicestack-text,C#,Nhibernate,Fluent Nhibernate,servicestack Text" />

C# NHibernate映射:在父项具有Insert触发器的ID之后插入子项,而不更新子项';父ID

C# NHibernate映射:在父项具有Insert触发器的ID之后插入子项,而不更新子项';父ID,c#,nhibernate,fluent-nhibernate,servicestack-text,C#,Nhibernate,Fluent Nhibernate,servicestack Text,让我先解释一下我们的情况 我们正在开发一个棕色字段应用程序。 有一个给定的数据库结构,我们不能像以下示例那样更改: 表1[ID][Field1][Field2][Field3] 表2[ID][Table1_ID][FieldA][FieldB][FieldC] Table1_ID是Table1的外键。这意味着表1可以有多个表2中的子项 所有字段和键都不能为空。每个表都有一个预插入触发器,用于设置其表序列的ID 我们的应用程序中有以下类 数据库表1的类: 公共类父类 { 公共虚拟长?Id{get;

让我先解释一下我们的情况

我们正在开发一个棕色字段应用程序。 有一个给定的数据库结构,我们不能像以下示例那样更改:

表1[ID][Field1][Field2][Field3]

表2[ID][Table1_ID][FieldA][FieldB][FieldC]

Table1_ID是Table1的外键。这意味着表1可以有多个表2中的子项

所有字段和键都不能为空。每个表都有一个预插入触发器,用于设置其表序列的ID

我们的应用程序中有以下类

数据库表1的类:

公共类父类
{
公共虚拟长?Id{get;set;}
公共虚拟字符串字段1{get;set;}
公共虚拟字符串字段2{get;set;}
公共虚拟字符串字段3{get;set;}
公共虚拟列表子项{get;set;}//包含表2的子项
}
数据库表2的类:

公共类子类
{
公共虚拟长?Id{get;set;}
公共虚拟长父ID{get;set;}
公共虚拟字符串FieldA{get;set;}
公共虚拟字符串字段b{get;set;}
公共虚拟字符串FieldC{get;set;}
}
我们需要通过网络序列化这个树结构(这只是最简单的版本)。 对于序列化,我们在ServiceStack中使用ServiceStack.Text

由于在序列化时(Table1->Table2->Table1->Table2…等等),作为对象从Table2到Table1的反向引用会导致循环引用错误,因此我们绑定到此结构

客户端/服务器在不设置任何Id或ParentId的情况下创建新结构。键值为空。我们希望NHibernate为我们做这件事

有没有办法创建一个有效的Fluent NHibernate映射,首先插入表1,使用数据库插入触发器中的新Id,将此Id应用于其子项的parentID并插入子项(表2)?


重要的是不要插入没有ParentId的子项,并在第二步中更新ParentId。

在找到答案的同时,您仍然可以1)循环级联。2) 保存父级,调用session.Flush()。3) 现在Parent.ID已就位,请调用ParentId为每个over children调用。。并调用.Save(孩子)。最后调用Flush()。事实上,这就是级联的工作原理;)