[英]NHibernate Many-to-Many Relation: Quering the properties of the joining table
[英]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.