我有一个用于加载实体的通用方法。我需要检查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]
因为结果实体是代理。 如何检查代理中空值的条件?
答案 0 :(得分:3)
使用NHibernate的ISession.Get
代替ISession.Load
。 Load
如果请求的项不存在则抛出异常,但它也可能返回稍后用于从数据库加载对象的代理 - 并且只有在项不存在时才会抛出。这就是发生在你身上的事情
如果数据库中不存在该项,则Get
在另一端返回null
。正是你想要的。
有关该主题的更多信息here。
答案 1 :(得分:3)
丹尼尔的初步答案是正确的。根据{{3}},Load
只应在知道该项目存在于数据库中时使用。
加载将从不返回null。它将始终返回实体或抛出异常。因为这是我们拥有的合同,所以允许Load在调用它时不会访问数据库,而是可以自由返回代理。
为什么这有用?好吧,如果您知道数据库中存在该值,并且您不想支付额外的选择以获得该值,但您希望获得该值,以便我们可以将该引用添加到对象,您可以使用Load来执行此操作
在您的示例中,ObjectNotFoundException
只能在数据库中不存在该项时发生。如果您无法保证该项目存在,则需要使用Get
而不是Load
。