簡體   English   中英

使用ReferencesAny時如何配置Fluent NHibernate以返回空值而不是丟失對象的代理

[英]How to configure Fluent NHibernate to return null instead of proxies for missing objects when using ReferencesAny

按照標題,我有一個具有ReferencesAny關聯的對象,但是所引用的對象可能已被刪除。 如果發生這種情況,當前缺少的對象將通過代理進行初始化,如果訪問該代理,則會拋出ObjectNotFound。 我希望能夠使此return null替代,其方式類似於在其他屬性上將notfound設置為“ ignore”。 我了解使用Session.Get和Session.Load之間的區別,但這是由於LINQ查詢而發生的。

因此,我的問題是,如何為缺少的對象指定“ any”關聯應返回null?

我正在使用xml配置,但是我想我的提示仍然可以為您提供幫助... NHibernate為那些不完整的映射提供了一個找不到屬性,默認情況下設置為“ exception ”。 在此示例中是參考多對一映射,但是它甚至可以用於一對多

<many-to-one name="MyReferencedObject" not-found="exception" />

但可以更改為忽略

<many-to-one name="MyReferencedObject" not-found="ignore" />

在這種情況下,結果將為NULL。 (但請注意,NHibernate將始終執行SQL select語句,因為這樣的“ NULL”值將不會被緩存)


編輯 :基於下面的評論,我不得不說,我的建議不適用於<any>映射。 抱歉,我應該更仔細地閱讀...但是,請允許我為您提供建議,以及解決方法。


我們可以介紹事件監聽器。 可以在這里找到更多信息http://nhibernate.info/doc/nh/en/index.html#objectstate-events

簡而言之,解決方案:

介紹事件監聽器

public class PostLoadListener 
           : NHibernate.Event.Default.DefaultPostLoadEventListener
{ ... }

並將其注入“ session-factory”配置中。

<event type="post-load">
    <listener class="MyLib.PostLoadListener, MyLib"/>
</event>

訣竅將在重寫的方法OnPostLoad中

public override void OnPostLoad(PostLoadEvent @event)
{
    base.OnPostLoad(@event);

    // the entity with <any> mapping 
    ConvertToNull(@event.Entity as MyAuditEntity); 
}

protected virtual void ConvertToNull(MyAuditEntity item)
{
    if (item == null)
    {
        return;
    }
    try
    {
        // access some property to check that reference is not a PROXY
        var id = item.AnyEntity.ID;
    }
    catch
    {
        // replace proxy with null
        item.AnyEntity = null; 
    }
}

當然,這不是像not-found =“ ignore”這樣的答案。 但是這種解決方法可以完成這項工作。

暫無
暫無

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

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