如何检查代理的空值

本文关键字:代理 空值 检查 何检查 | 更新日期: 2023-09-27 18:21:12

我有一个加载实体的通用方法。我需要检查结果值是否为空值。

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]

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

如何检查代理的空值

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

点击此处了解更多关于该主题的信息。

Daniel的初始答案是正确的。根据Ayende的博客,只有当您知道数据库中存在该项目时,才应使用Load

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

为什么这有用?好吧,如果你知道数据库中存在该值,并且你不想支付额外的选择费用,但你想获得该值,这样我们就可以将该引用添加到对象中,你可以使用Load这样做

在您的示例中,只有当数据库中不存在该项时,才会出现ObjectNotFoundException。如果您不能保证物品存在,则需要使用Get而不是Load