Nhibernate Get By Id返回ObjectNotFoundException而不是null

时间:2010-10-25 18:17:02

标签: c# nhibernate fluent-nhibernate

我正在使用流利的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

如何使该实体可以为空并且不返回异常?

3 个答案:

答案 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

的更多信息