Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Nhibernate多表与特定表具有一对多关系_C#_Sql_.net_Nhibernate - Fatal编程技术网

C# Nhibernate多表与特定表具有一对多关系

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吧。 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>