C# 如何检查代理的空值

C# 如何检查代理的空值,c#,nhibernate,proxy,C#,Nhibernate,Proxy,我有一个加载实体的通用方法。我需要检查结果值是否为空值 public TEntity LoadById(long id) { TEntity result = SessionInstance.Load<TEntity>(id); if (result != null) //This condition is always true if (result.Id == 0 )

我有一个加载实体的通用方法。我需要检查结果值是否为空值

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;
}
public tenty LoadById(长id)
{
TEntity结果=会话持续时间负载(id);
if(result!=null)//此条件始终为真
if(result.Id==0)//抛出ObjectNotFoundException
抛出新异常(“Ex-Text”);
返回结果;
}
但是我的条件(
if(result!=null)
)始终为真,下一行
result.Propagate()
通过以下消息抛出
ObjectNotFoundException
异常:
不存在具有给定标识符的行[RCISP.Domain.Entities.Person\1000]

因为结果实体是一个代理。
如何检查代理中的空值条件?

使用NHibernate的
ISession.Get
而不是
ISession.Load
<代码>加载如果请求的项不存在,则引发异常,但它也可能返回一个代理,该代理稍后用于从数据库加载对象,并且只有在该项不存在时才会引发异常。这就是发生在你身上的事。
另一侧的
Get
如果该项在数据库中不存在,则返回
null
。正是你想要的


更多关于这个话题的信息。

丹尼尔最初的回答是正确的。根据,
Load
仅当您知道该项存在于数据库中时才应使用

Load永远不会返回null。它将始终返回实体或引发异常。因为这是我们与它签订的合同,所以当您调用它时,允许加载不命中数据库,它可以自由地返回代理

这为什么有用?好的,如果您知道数据库中存在该值,并且不想为此支付额外的select,但是您希望获得该值以便我们可以将该引用添加到一个对象,那么您可以使用Load来执行此操作


在您的示例中,
ObjectNotFoundException
只能在数据库中不存在该项时发生。如果您不能保证项目存在,则需要使用NHibernate中的
Get
not
Load

我熟悉
Get
。我的项目基于
延迟加载
。我需要在NHibernate中加载
。我该怎么办?@Ehsan:这个
Propagate
方法在做什么?这个方法在加载实体后是一个强制方法。假设检查不为null时需要它。@Ehsan:但是它做什么呢?如果它访问实体的属性,则无需使用代理,因为它无论如何都会加载对象。@Ehsan:您的编辑不会清除任何内容。为什么要用静态值覆盖键?