簡體   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