2012-01-23 51 views
2

我有加載實體的通用方法。我需要檢查空值的結果值。如何檢查代理的空值

public TEntity LoadById(long id) 
{ 
    TEntity result = SessionInstance.Load<TEntity>(id); 

    if (result != null)      //This condition is always true 
     if (result.Id == 0)     //Throws ObjectNotFoundException 
       throw new Exception("Ex Text"); 

    return result; 
} 

但我的條件(if (result != null))永遠是真實的下一行result.Propagate()是這個消息拋出ObjectNotFoundException異常:No row with the given identifier exists[RCISP.Domain.Entities.Person#1000]

因爲結果實體是一個代理。 如何在代理中檢查空值的條件?

回答

3

使用NHibernate的ISession.Get而不是ISession.LoadLoad如果請求的項不存在,則會引發異常,但它也可能返回稍後用於從數據庫加載對象的代理 - 並且只有在項不存在時纔會拋出。這就是發生在你身上的事情。
Get如果該項不存在於數據庫中,則返回null。正是你想要的。

更多關於該主題的信息here

+0

我很熟悉NHibernate中的Get。我的項目基於'懶惰加載'。我需要在NHibernate中加載。我該怎麼辦? – Ehsan

+0

@Ehsan:這個Propagate方法在做什麼? –

+0

此方法是加載實體後的強制方法。假設它對於非空的檢查是必需的。 – Ehsan

3

丹尼爾的初步答案是正確的。根據Ayende's blog,只有在知道該項目存在於數據庫中時才應使用Load

加載將從不返回null。它將始終返回一個實體或拋出異常。由於這是我們擁有的合同,因此在您調用Load時不允許觸擊數據庫,而是可以自由返回代理。

爲什麼這很有用?那麼,如果知道該值存在於數據庫中,並且您不想支付額外的選擇來獲得該值,但是您想要獲取該值,以便我們可以將該參考添加到對象中,則可以使用加載這樣做

在你的例子中,ObjectNotFoundException只能發生在該項目不存在於數據庫中。如果您不能保證物品存在,則需要使用Get而不是Load