C# Nhibernate多表与特定表具有一对多关系
我有一张桌子,我们叫a吧。 A有字段objId 还有其他表,我们称之为B、C和D,它们有一个a记录列表。 需要通过将记录添加到表B、C和D之一的A记录列表中来对记录进行装箱。objId字段需要是具有A列表的B/C/D记录的主键(id) 这意味着-objId对于许多表来说是FK。 我从B表开始。 但是在B table创建之后,表A的字段objId被创建。那么现在表C和表D会是什么样的呢?他们无法在表中创建列objId 代码是:C# Nhibernate多表与特定表具有一对多关系,c#,sql,.net,nhibernate,C#,Sql,.net,Nhibernate,我有一张桌子,我们叫a吧。 A有字段objId 还有其他表,我们称之为B、C和D,它们有一个a记录列表。 需要通过将记录添加到表B、C和D之一的A记录列表中来对记录进行装箱。objId字段需要是具有A列表的B/C/D记录的主键(id) 这意味着-objId对于许多表来说是FK。 我从B表开始。 但是在B table创建之后,表A的字段objId被创建。那么现在表C和表D会是什么样的呢?他们无法在表中创建列objId 代码是: 我需要如何创建正确的关联?通常,有更多的方法来处理这种情况-每种方法
我需要如何创建正确的关联?通常,有更多的方法来处理这种情况-每种方法都需要一些调整/扩展。也就是说,无论如何都必须更改数据库结构 若A的实例可以被B、C、D中的每一个引用,那个么唯一的方法就是引入外键列BobObjectId、CObjectId、DObjectId 如果A的实例可以被其中一个(B,C,D)独占使用,我们需要新的列,我们称它为
鉴别器
<class name="A">
<id name="Id" generator="guid" />
<property name="ObjId" />
<property name="Discriminator" />
</class>
其中的实现应该是这样的
public virtual void AddA(A a)
{
As.Add(a);
a.ObjectId = this.ID
a.Discriminator = 'B'
}
注意:在这种情况下,我们将ID分配到ObjectId
。它正在工作,但仅当ID已分配时。如果对象B
是瞬态的,并且具有默认的ID值,那么它将不起作用。在这种情况下,我们需要创建一些变通方法。例如,刷新()B,然后分配引用
因此,我们成功地将鉴别器值正确地管理/填充/插入到A实例/记录中。现在,我们还可以将其用于映射。B、C、D行李映射将非常相似:
<class name="A">
<bag name="As" cascade="All" batch-size="25"
where=" Discriminator = 'B' " >
<key column="ObjId" />
<one-to-many class="A" />
</bag>
where=“Discriminator='B'”
是将过滤器注入我们的集合的好方法。同样适用于C,D。。。还有……非常感谢您的帮助。正如你所说,“一般来说,有更多的方法来处理这种情况”。它们是什么?你写的方式是最好的方式吗?如果这有帮助的话,那就太好了。享受NHiberante;)
this.Update(session =>
{
var bRecord = ....;
bRecord.As.Add(new ARecord {
...
});
session.Update(bRecord);
});
<class name="A">
<id name="Id" generator="guid" />
<property name="ObjId" />
<property name="Discriminator" />
</class>
var a = new A();
b.AddA(a);
public virtual void AddA(A a)
{
As.Add(a);
a.ObjectId = this.ID
a.Discriminator = 'B'
}
<class name="A">
<bag name="As" cascade="All" batch-size="25"
where=" Discriminator = 'B' " >
<key column="ObjId" />
<one-to-many class="A" />
</bag>