簡體   English   中英

nhibernate Composite-id,不存在鍵多對一記錄

[英]nhibernate composite-id with not existing key-many-to-one record

我有舊的遺留數據庫,它們的表中有無效鏈接。 我在nhibernate中映射了這樣的類:

<class name="Visible" table="table_visible">
    <composite-id>
        <key-many-to-one column="object_id" name="ObjectA" />
        <key-many-to-one column="sub_object_id" name="SubObject" />
    </composite-id>
    <property column="visible" name="VisibleRow" />
</class>

和:

public class Visible
{
    public virtual ObjectAClass ObjectA { get; set; }
    public virtual SubObjectClass SubObject { get; set; }
    public virtual bool VisibleRow { get; set; }

    public override bool Equals(object obj)
    {
        var other = ((Visible)obj);
        return this.ObjectA.Equals(other.ObjectA) && this.SubObject.Equals(other.SubObject);
    }

    public override int GetHashCode()
    {
        return this.ObjectA.GetHashCode() + (this.SubObject != null? this.SubObject.GetHashCode(): 0);
    }
}

現在,當數據庫中的所有聯接正確時,所有方法都可以正常工作,但是當我找到沒有實體的sub_object_id時,nhibernate會拋出錯誤

No row with the given identifier exists:[SubObject#123]

有沒有辦法映射復合鍵,以便在找不到其子實體時不會加載整個實體(就像內部聯接一樣)?

NHibernate v2.0.50727

遵循Daniel Schilling的想法,其中使用where exist子查詢來獲取Visible實體,發現映射中有可用的loader元素。

<class name="ObjectA" table="table_object">
    .........   
    <set name="VisibleList" cascade="all" lazy="false" inverse="true">
        <key column="object_id" />
        <one-to-many class="Visible" />
        <loader query-ref="valid_entities"/>
    </set>

</class>
<sql-query name="valid_entities">
    <load-collection alias="v" role="ObjectA.VisibleList"/>
    SELECT {v.*}
    FROM table_visible v
    INNER JOIN table_sub_entities e ON e.sub_entity_id=v.sub_entity_id
    WHERE v.object_id=?
</sql-query>

無需更改任何其他內容。

<key-many-to-one column="sub_object_id" name="SubObject" not-found="ignore" />

...可能會有所幫助。 NHibernate文檔中 ...

ignore會將缺失的行視為空關聯

請注意與使用此選項相關的性能損失。 每當NHibernate獲取Visible實體時,它也必須獲取SubObject 如果您不繼續在查詢中獲取它,則意味着NHibernate將發出大量延遲加載。

這不符合您的“當找不到其子實體時,將不會加載整個實體”的目標。 相反,NHibernate將為您提供一個具有空子實體的實體。 如果您想要這種類似於內部SubObject行為,那么我認為您需要使用where exists子查詢來獲取Visible實體,以確保SubObject實際上存在。

最好的選擇是修復數據庫中的數據並添加外鍵約束。

我只是碰到了這一點: 與not-found =“ ignore”的關系 我保證我不會復制Ricci的內容-我是根據自己的經驗編寫的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM