我正在使用流利的Nhibernate。此代码根据其ID从DB加载类型T的实例。
public T GetById(IdT id, bool shouldLock)
{
T entity;
if (shouldLock)
{
entity = (T) NHibernateSession.Load(persitentType, id, LockMode.Upgrade);
}
else
{
entity = (T) NHibernateSession.Load(persitentType, id);
}
return entity;
}
但我有很大的问题。当我打电话给我时,我得ObjectNotFoundException
而不是null
。
如何使该实体可以为空并且不返回异常?
答案 0 :(得分:12)
我会使用Get而不是Load。 Get将返回null,而不是异常。
答案 1 :(得分:9)
我认为你在Load
做错了。这可以通过ID为您创建一个NHibernate代理对象,而无需实际查询数据库。
当你调用一个属性时,它将查询数据库,如果你提供了一个错误的id,那么没有底层对象,因此就是异常。
您将使用此正常的位置是因为您有一个State对象,而用户在下拉菜单中选择了PA。您已经拥有密钥PA,而不必查询数据库中的State对象,您可以调用Load
,然后将该状态对象传递到另一个对象,以使对象X与状态PA正确关系。
您希望用于常规get对象的方法,或者如果key不存在则获取null只是Session.Get<T>(object ID)
答案 2 :(得分:4)
Load
永远不会返回null。它将始终返回实体或抛出异常。如果您希望该行为使用Get
。有关此Difference between Get and Load