gpt4 book ai didi

c# - 如何配置 Fluent NHibernate 在使用 ReferencesAny 时返回 null 而不是丢失对象的代理

转载 作者:行者123 更新时间:2023-12-02 13:56:14 24 4
gpt4 key购买 nike

根据标题,我有一个具有 ReferencesAny 关联的对象,但引用的对象可能已被删除。如果发生这种情况,当前丢失的对象将使用代理进行初始化,然后在访问时抛出 ObjectNotFound。我希望能够以与在其他属性上将 not-found 设置为“忽略”类似的方式返回 null。我了解使用 Session.Get 和 Session.Load 之间的差异,但这是由于 LINQ 查询而发生的。

所以,我的问题是,如何指定对于“任何”关联丢失的对象应返回 null?

最佳答案

我正在使用xml配置,但我想我的提示无论如何都可以帮助你...NHibernate为那些不完整映射提供了一个未找到的属性 默认设置为“异常(exception)”。在此示例中是引用多对一映射,但它甚至可以用于一对多

<many-to-one name="MyReferencedObject" not-found="exception" />

但可以改为忽略

<many-to-one name="MyReferencedObject" not-found="ignore" />

在这种情况下,结果将为 NULL。 (但是要小心,NHibernate总是会执行SQL select语句,因为这样的“NULL”值不会被缓存)


编辑:根据下面的评论,我不得不说,我的建议不适用于 映射。抱歉,我应该更仔细地阅读......但是,请让我向您提供建议,以及如何修复它。


我们可以引入事件监听器。更多信息可以在这里找到http://nhibernate.info/doc/nh/en/index.html#objectstate-events

解决方案简而言之:

引入事件监听器

public class PostLoadListener 
: NHibernate.Event.Default.DefaultPostLoadEventListener
{ ... }

并将其注入(inject)到“session-factory”配置中。

<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"这样的答案。但这个解决方法可以完成这项工作。

关于c# - 如何配置 Fluent NHibernate 在使用 ReferencesAny 时返回 null 而不是丢失对象的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13143476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com