nhibernate多对多关联 - 属性返回null set

时间:2009-11-23 10:06:54

标签: nhibernate many-to-many associations

我和A之间有很多关系。(我知道我可以考虑重构等,但这是另一回事)。 我的代码做了这样的事情:

// given aId is the Id of an instance of A, and A has a many to many set of B's
    A a = myActiveSession.Get<A>(aId);
    a.Bs.Add(new B() {Name="dave"});

我得到一个例外,因为a.Bs为NULL。 这只发生在测试套件的上下文中,当我运行单个测试时,我得到一个集合,一切都很好。 我希望由于默认是懒惰提取,当我访问属性getter时Bs将被初始化,但是如果这个失败我希望得到一个异常,而不是简单地为null ...因为这样我没有立即知道导致这个的原因。任何想法?

PS:这是映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="MyNamespace" assembly="MyAssembly">
  <class name="A" table="A" dynamic-update="true">
    <id name="id" type="integer" access="field">
      <column name="ID"/>
      <generator class="native"/>
    </id>
    <property name="name" type="string" access="field"/>
    <set name="Bs" table="A_B">
      <key column="a_id"/>
      <many-to-many column="b_id" class="B" />
    </set>
  </class>
</hibernate-mapping>

更新:当我修复了一些会话清理的代码(参见@Darin Dimitrov的建议)时,我设法让它工作了,但是,我仍然不明白可能导致这种奇怪行为的原因(而不是接收)一些明显的例外)。所以目前这仍然是一个谜。

1 个答案:

答案 0 :(得分:1)

单元测试可以从不同的线程并行执行,因此它们应该是独立的。我怀疑在你的情况下,Session对象在多个测试中被重用,而另一个测试可能会混淆Bs属性。确保会话在测试中创建并在之后销毁,即

using (var session = sessionFactory.OpenSession())
{
    A a = myActiveSession.Get<A>(aId);
}