[英]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.