在NHibernate中使用LinFu ProxyFactoryFactory时,集合的备份字段为空

在NHibernate中使用LinFu ProxyFactoryFactory时,集合的备份字段为空,nhibernate,fluent-nhibernate,linfu-dynamicproxy,Nhibernate,Fluent Nhibernate,Linfu Dynamicproxy,当我尝试从城堡ProxyFactory工厂切换到NHibernate的LinFu ProxyFactory工厂时,我遇到了一个问题 我有这样一个实体: public class Foo { private ISet<Bar> _bars = new HashedSet<Bar>(); public virtual void AddBar(Bar bar) { if (!_bars.Contains(bar)

当我尝试从城堡ProxyFactory工厂切换到NHibernate的LinFu ProxyFactory工厂时,我遇到了一个问题

我有这样一个实体:

public class Foo
{
    private ISet<Bar> _bars = new HashedSet<Bar>();

    public virtual void AddBar(Bar bar)
    {
       if (!_bars.Contains(bar)
            _bars.Add(bar);

       bar.Foo = this;
    }
}
public class FooDbMap : ClassMap<Foo>
{
     public FooDbMap()
     {
          HasMany(x => x.Bars)
              .Access.CamelCaseField(Prefix.Underscore)
              .LazyLoad()
              .KeyColumn("FooId")
              .AsSet()
              .Cache.ReadWrite();
     }
}
公共类Foo
{
私有ISet_bar=新哈希集();
公共虚拟void AddBar(Bar)
{
如果(!\u条。包含(条)
_条。添加(条);
bar.Foo=这个;
}
}
这是用Fluent NHibernate映射的,如下所示:

public class Foo
{
    private ISet<Bar> _bars = new HashedSet<Bar>();

    public virtual void AddBar(Bar bar)
    {
       if (!_bars.Contains(bar)
            _bars.Add(bar);

       bar.Foo = this;
    }
}
public class FooDbMap : ClassMap<Foo>
{
     public FooDbMap()
     {
          HasMany(x => x.Bars)
              .Access.CamelCaseField(Prefix.Underscore)
              .LazyLoad()
              .KeyColumn("FooId")
              .AsSet()
              .Cache.ReadWrite();
     }
}
公共类foodmap:ClassMap
{
公共foodmap()
{
有许多(x=>x.bar)
.Access.CamelCaseField(前缀.下划线)
.LazyLoad()
.KeyColumn(“FooId”)
1.资产()
.Cache.ReadWrite();
}
}
该关系是双向的,并且在条形图一侧也映射为双向关系

当我调用AddBar方法时,问题就出现了。_bars集合为null,并引发NullReferenceException

如果我切换回Castle ProxyFactory工厂,问题就会消失

并非所有映射的集合都会发生此错误,只有这一个实例

即使我将_bars更改为readonly,问题仍然会出现!因此有人正在设法将readonly字段设置回null,即使该字段已分配


有什么想法吗?

你的
AddBar
方法是虚拟的,对吗?否则不应该工作。你是在
Foo
对象或它的代理上调用该方法吗?哪个NHibernate版本?你试过NHibernate 3.2.0的内部代理工厂吗?@cremor是的,显然我已经减少了这个示例的代码,但所有内容通常都是“a”我实际上正在从NH2.1升级到3.1(我还没有升级到3.2,因为我也在使用NHValidator和Fluent NHibernate,它们似乎还没有更新到3.2)。在NH 2中一切都很好,尽管我以前使用过Castle代理提供程序。此外,是的,正在对Foo对象的代理调用该方法。如果我记得正确的话,LinFu(以及3.2中的内部代理工厂)创建代理时不要调用基构造函数。您可以通过在初始化
\u条
的行上设置断点来尝试此操作。但这确实不应该是一个问题,因为NHibernate应该在任何人都可以访问对象之前为其分配一个
PersistentSet
。您测试过它使用默认属性的行为吗access?您好,谢谢您的帮助。顺便说一句,我已经尝试创建了一个空的公共构造函数,这样我就可以设置一个断点,并确保分配了_-bars-确实如此。因此,在构造实体和调用AddBar方法之间,_-bars被设置为null(即使它是只读的)。我还尝试删除.Access.CamelCaseField行、LazyLoad行和Cache.ReadWrite行:在所有情况下,问题都会继续存在。令人惊讶的是,该实体实际上还有四个ISET,所有ISET都进行了类似的映射,而且它们似乎都在工作(至少根据我的测试覆盖率)。您可以使用一个普通的旧ISET(自行实现)
条的属性
并映射该条(而不是后场),然后您可以在setter中放置断点。您的
AddBar
方法是虚拟的,对吗?否则不应该工作。您是在
Foo
对象或其代理上调用该方法吗?哪个NHibernate版本?您是否尝试过NHibernate 3.2.0的内部代理工厂?@cremor是的,显然我已经减少了此示例的代码,但一切都是“应该的”。我实际上正在从NH2.1升级到3.1(我还没有升级到3.2,因为我也在使用NHValidator和Fluent NHibernate,它们似乎还没有更新到3.2)。在NH 2中一切都很好,尽管我以前使用过Castle代理提供程序。此外,是的,正在对Foo对象的代理调用该方法。如果我记得正确的话,LinFu(以及3.2中的内部代理工厂)创建代理时不要调用基构造函数。您可以通过在初始化
\u条
的行上设置断点来尝试此操作。但这确实不应该是一个问题,因为NHibernate应该在任何人都可以访问对象之前为其分配一个
PersistentSet
。您测试过它使用默认属性的行为吗access?您好,谢谢您的帮助。顺便说一句,我已经尝试创建了一个空的公共构造函数,这样我就可以设置一个断点,并确保分配了_-bars-确实如此。因此,在构造实体和调用AddBar方法之间,_-bars被设置为null(即使它是只读的)。我还尝试删除.Access.CamelCaseField行、LazyLoad行和Cache.ReadWrite行:在所有情况下,问题都会继续存在。令人惊讶的是,该实体实际上还有四个ISET,所有ISET都进行了类似的映射,而且它们似乎都在工作(至少根据我的测试覆盖率)。您可以使用一个普通的旧ISET(自行实现)属性,并映射该属性(不是后场),然后可以在setter中放置断点。