根据标题,我有一个具有 ReferencesAny 关联的对象,但引用的对象可能已被删除。如果发生这种情况,当前缺少的对象会使用代理进行初始化,然后如果访问,则抛出 ObjectNotFound。我希望能够以类似于在其他属性上将 not-found 设置为“忽略”的方式返回 null。我了解使用 Session.Get 和 Session.Load 之间的区别,但这是由于 LINQ 查询而发生的。
所以,我的问题是,我怎样才能指定 null 应该为“任何”关联的缺失对象返回?
根据标题,我有一个具有 ReferencesAny 关联的对象,但引用的对象可能已被删除。如果发生这种情况,当前缺少的对象会使用代理进行初始化,然后如果访问,则抛出 ObjectNotFound。我希望能够以类似于在其他属性上将 not-found 设置为“忽略”的方式返回 null。我了解使用 Session.Get 和 Session.Load 之间的区别,但这是由于 LINQ 查询而发生的。
所以,我的问题是,我怎样才能指定 null 应该为“任何”关联的缺失对象返回?
我正在使用xml配置,但我想我的提示无论如何都可以帮助你...... NHibernate 为那些不完整的映射提供了一个未找到的属性,默认情况下设置为“异常”。在此示例中是引用多对一映射,但它甚至可以用于一对多
<many-to-one name="MyReferencedObject" not-found="exception" />
但可以改成忽略
<many-to-one name="MyReferencedObject" not-found="ignore" />
在这种情况下,结果将为 NULL。(但要注意,NHibernate 将始终执行 SQL 选择语句,因为这样的“NULL”值不会被缓存)
编辑:根据下面的评论,我不得不说,我的建议不适用于<any>映射。抱歉,我应该更仔细地阅读......但是,请让我为您提供建议,如何解决它。
我们可以引入事件监听器。更多可以在这里找到http://nhibernate.info/doc/nh/en/index.html#objectstate-events
简而言之解决方案:
引入事件监听器
public class PostLoadListener
: NHibernate.Event.Default.DefaultPostLoadEventListener
{ ... }
并将其注入“会话工厂”配置。
<event type="post-load">
<listener class="MyLib.PostLoadListener, MyLib"/>
</event>
诀窍将在重写方法OnPostLoad 内部
public override void OnPostLoad(PostLoadEvent @event)
{
base.OnPostLoad(@event);
// the entity with <any> mapping
ConvertToNull(@event.Entity as MyAuditEntity);
}
protected virtual void ConvertToNull(MyAuditEntity item)
{
if (item == null)
{
return;
}
try
{
// access some property to check that reference is not a PROXY
var id = item.AnyEntity.ID;
}
catch
{
// replace proxy with null
item.AnyEntity = null;
}
}
当然,这不是像 not-found="ignore" 这样的答案。但是这种解决方法可以完成这项工作。