繁体   English   中英

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

[英]Nhibernate Multiple table have One to many relation to specific table

我有一个表,称为A。A具有字段-objId。

还有其他表称为B,C和D。它们具有A记录列表。 需要通过将A记录添加到表B,C和D之一的A记录列表中来创建记录。objId字段必须是B / C / D记录的PK(id)(谁拥有该列表)的A。

这意味着-objId是许多表的FK。 我从表B开始。但是在创建了B表之后,就创建了表A的字段objId。 现在桌子C和D会是什么? 他们无法在表中创建objId列。

代码是:

<id name="Id">
  <generator class="guid" />
</id>

<bag name="As" cascade="All">
  <key column="ObjId" />
  <one-to-many class="A" />
</bag>

<class name="A">
<id name="Id">
  <generator class="guid" />
</id>
<property name="ObjId" />

public class B
{
    public virtual Guid Id { get; set; }
    public virtual IList<A> As{ get; set; }
}

public class A
{  
    public virtual Guid Id { get; set; }
    public virtual string ObjId { get; set; }
}

向B添加A记录:

       this.Update(session =>
       {
           var bRecord = ....;

           bRecord.As.Add(new ARecord {
                 ...
          });

             session.Update(bRecord);
       });

我需要如何创建正确的关联?

通常,有更多方法来处理这种情况-每个方法都需要进行一些调整/扩展。 也就是说,您仍然必须更改数据库结构

如果A的实例可以被B,C,D中的每个引用,则唯一的方法是引入外键列BObjectId,CObjectId,DObjectId。

如果A的实例可以由其中一个(B,C,D)独占使用,则需要新的列,我们称它为Discriminator

<class name="A">
  <id name="Id" generator="guid" />
 <property name="ObjId" />
 <property name="Discriminator" />
</class>

现在,我们必须在C#代码中将值正确填写到Discriminator中。 如果将A分配给B,我们必须填写“ B”

var a = new A();
b.AddA(a);

实施应该是这样的。

public virtual void AddA(A a)
{
    As.Add(a);
    a.ObjectId = this.ID
    a.Discriminator = 'B'
}

注意:在这种情况下,我们将ID分配给ObjectId 它是有效的,但前提是已经分配了ID。 如果对象B是瞬态的且具有默认ID值,则它将不起作用。 在这种情况下,我们将需要创建一些解决方法。 例如Flush()B,然后分配引用...

因此,我们成功地将Discriminator值正确地管理/填写/插入到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' "是NHibernate如何将过滤器注入我们的集合的好方法。 将相同的内容应用于C,D ...和...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM