我和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的建议)时,我设法让它工作了,但是,我仍然不明白可能导致这种奇怪行为的原因(而不是接收)一些明显的例外)。所以目前这仍然是一个谜。
答案 0 :(得分:1)
单元测试可以从不同的线程并行执行,因此它们应该是独立的。我怀疑在你的情况下,Session
对象在多个测试中被重用,而另一个测试可能会混淆Bs
属性。确保会话在测试中创建并在之后销毁,即
using (var session = sessionFactory.OpenSession())
{
A a = myActiveSession.Get<A>(aId);
}