【问题标题】:Nhibernate Multiple table have One to many relation to specific tableNhibernate Multiple table与特定表具有一对多关系
【发布时间】:2014-03-20 17:40:36
【问题描述】:

我有一张桌子,我们叫 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; }
}

将A记录添加到B:

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

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

             session.Update(bRecord);
       });

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

【问题讨论】:

    标签: c# sql .net nhibernate


    【解决方案1】:

    一般来说,有更多方法可以处理这种情况——每种方法都需要一些调整/扩展。 IE。无论如何你都必须改变你的数据库结构

    如果 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 然后分配引用...

    因此,我们成功地将鉴别器值正确管理/填充/插入到 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... 和 ... 应用相同的内容

    【讨论】:

    • 非常感谢您的帮助。正如您所说-'一般来说,有更多方法可以处理这种情况'。这些是什么?你写的方式是最好的方式吗?
    • 如果有帮助的话就太好了。享受 NHiberante ;)
    猜你喜欢
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多