0
我和A和B之間有多對多的關係(我知道我可以考慮重構等,但那是另一回事)。 我的代碼做這樣的事情:nhibernate多對多關聯 - 屬性返回null set
// 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。 這隻發生在一個測試套件的上下文中,當我運行單個測試時,我得到一組並且一切正常。 我期望既然默認是懶惰的獲取,Bs將被初始化,當我訪問屬性getter,但如果這失敗我期望得到一個異常,而不是簡單的空......因爲這種方式我不知道是什麼原因這個。有任何想法嗎?
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季米特洛夫的建議)工作,但是,我仍然不明白可能會導致這種奇怪的行爲(而不是接收到一些明確的例外)。所以目前這仍然是一個謎。
我也懷疑這一點,但在這種情況下,我確信測試不是並行運行。 – 2009-11-23 10:17:37
即使它們沒有並行運行,陳舊的對象也可以保留在前一次測試運行的會話中。這就是爲什麼爲每個測試創建一個新的會話是一個好習慣。 – 2009-11-23 10:18:33
這是真的,但我確實創建了一個新的會話。我還在會話工廠中進行了更改(嘗試從會話池轉移到使用NHibernate的會話池並依靠ADO.net連接池),因此我正在研究這一點。但是我想知道是什麼會導致這種情況,因爲即使會話出現問題,A實例也會在同一個測試(並已提交)的單獨早期步驟中創建,並在稍後進行提取。這個由兩個新對象組成的關聯何時會變得糟糕? – 2009-11-23 10:25:23