如何检查代理的空值
本文关键字:代理 空值 检查 何检查 | 更新日期: 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
。