Nhibernate的GetById返回ObjectNotFoundException而不是null

6

我正在使用流畅的Nhibernate。这段代码根据ID从数据库加载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个回答

12

我会使用 Get 而不是 Load。Get 会返回 null,而不是抛出异常。


实体类型是可空的,很可能是引用类型。 - Aliostad
1
无论如何,解决问题的方法是使用Get,而不是尝试进行延迟加载... - Kevin Stricker
2
+1 这是正确的答案,只是缺少我给出的解释。 - Chris Marisic

10

我认为你对 Load 的作用有所误解。这会通过ID为您创建一个NHibernate代理对象,而不实际查询数据库。

当您调用属性时,它将查询数据库,如果提供了错误的ID,则没有基础对象,因此会出现异常。

您通常使用它的情况是,比如您有一个State对象,用户在下拉列表中选择了PA。与其必须查询数据库以获取State对象,不如直接调用 Load,然后将该State对象传递到其他对象中,以获得Object X到State PA的正确关系。

如果要进行一般获取对象或获取null(如果键不存在),则应使用的方法只是 Session.Get<T>(object ID)


4

Load方法永远不会返回null。它总是会返回一个实体或抛出异常。如果您需要这种行为,请使用Get方法。更多信息请参考获取和加载之间的区别


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接