C# NHibernate,如何禁用孤立引用的附加选择

C# NHibernate,如何禁用孤立引用的附加选择,c#,nhibernate,mapping,nhibernate-mapping,eager-loading,C#,Nhibernate,Mapping,Nhibernate Mapping,Eager Loading,我正在使用NHibernate进行数据访问,并且有这样的情况 public class B { public virtual long Id { get; set;} ... } public class B { public virtual long Id { get; set;} public virtual A AReference { get; set; } ... } 和映射 public class BMapping : ClassMapping&l

我正在使用NHibernate进行数据访问,并且有这样的情况

public class B
{
   public virtual long Id { get; set;}
   ...
}
public class B
{
   public virtual long Id { get; set;}
   public virtual A AReference { get; set; }
   ...
} 
和映射

public class BMapping : ClassMapping<B>
{
    ...
        ManyToOne(x => x.AReference, mapper =>
        {
            mapper.ForeignKey("none");
            mapper.Insert(false);
            mapper.Update(false);
            mapper.Column("a_id");
            mapper.Fetch(FetchKind.Join);
            mapper.NotFound(NotFoundMode.Ignore);
        });
    ...
}
允许我在不存在“不存在具有给定标识符的行”异常的情况下检索数据,但NHibernate似乎正在尝试使用单独的选择加载该孤立项,如

SELECT ... FROM tableA where tableA.ID = ?
所以,问题是,我可以禁用额外的查询吗?如何禁用

提前感谢。

正如这里和这里所讨论的,重点是:

当您指定.NotFound().Ignore()时,这将强制立即加载实体,并且不能用.LazyLoad()覆盖该实体。NHibernate之所以这样做,是因为它必须确保关系存在或不存在,因为您不依赖数据库来执行此操作

检查一下这个

主要是那里提供的链接

了解如何创建自定义PocoEntityTuplizer,以便使用

。。在Person实体的构建过程中,集合对象[]的值也将包含CountryProxy。假设DB中缺少Id==0的(根据需要使用您自己的逻辑)。此代理将替换为null,因此不会执行选择


谢谢你的回复。实现了我的PocoEntityTuplizer,但似乎在到达SetPropertyValue(对象实体,对象[]值)之前就完成了选择。我的意思是我有类似于
code
public override void SetPropertyValues(对象实体,对象[]值){var aId=((int?)值[14]);if(aId.HasValue&&aId.Value==333){values[25]=null;}base.SetPropertyValues(实体,值);}
code
,其中333是孤立id。因此选择。。。其中id=333是在这之前完成的。很难找到哪里出了问题。很抱歉提出这个建议,但请耐心等待,并尝试检查您的所有设置。因为这种方法是有效的。。这不容易,但很重要。这是唯一的办法。我很难在你自己的代码上提供更多的帮助…是的,设置NotFoundMode.Exception代替ignore很有帮助,现在可以工作了。你救了我一天,再次感谢。见到你真是太好了。我很高兴你没有放弃。。你成功了。享受美妙的恩希伯内特,先生!;)
SELECT ... FROM tableA where tableA.ID = ?