如何检查代理的空值

时间:2012-01-23 08:46:23

标签: c# nhibernate proxy

我有一个用于加载实体的通用方法。我需要检查null值的结果值。

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]

因为结果实体是代理。 如何检查代理中空值的条件?

2 个答案:

答案 0 :(得分:3)

使用NHibernate的ISession.Get代替ISession.LoadLoad如果请求的项不存在则抛出异常,但它也可能返回稍后用于从数据库加载对象的代理 - 并且只有在项不存在时才会抛出。这就是发生在你身上的事情 如果数据库中不存在该项,则Get在另一端返回null。正是你想要的。

有关该主题的更多信息here

答案 1 :(得分:3)

丹尼尔的初步答案是正确的。根据{{​​3}},Load只应在知道该项目存在于数据库中时使用。

  

加载将从不返回null。它将始终返回实体或抛出异常。因为这是我们拥有的合同,所以允许Load在调用它时不会访问数据库,而是可以自由返回代理。

     

为什么这有用?好吧,如果您知道数据库中存在该值,并且您不想支付额外的选择以获得该值,但您希望获得该值,以便我们可以将该引用添加到对象,您可以使用Load来执行此操作

在您的示例中,ObjectNotFoundException只能在数据库中不存在该项时发生。如果您无法保证该项目存在,则需要使用Get而不是Load