2009-11-23 31 views
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季米特洛夫的建議)工作,但是,我仍然不明白可能會導致這種奇怪的行爲(而不是接收到一些明確的例外)。所以目前這仍然是一個謎。

回答

1

單元測試可以從不同的線程並行執行,因此它們應該是獨立的。我懷疑在你的情況下,Session對象被重複使用在多個測試中,另外一個測試可能會與Bs屬性混淆。確保會話是在測試內部創建的,並在之後銷燬,即

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

我也懷疑這一點,但在這種情況下,我確信測試不是並行運行。 – 2009-11-23 10:17:37

+0

即使它們沒有並行運行,陳舊的對象也可以保留在前一次測試運行的會話中。這就是爲什麼爲每個測試創建一個新的會話是一個好習慣。 – 2009-11-23 10:18:33

+0

這是真的,但我確實創建了一個新的會話。我還在會話工廠中進行了更改(嘗試從會話池轉移到使用NHibernate的會話池並依靠ADO.net連接池),因此我正在研究這一點。但是我想知道是什麼會導致這種情況,因爲即使會話出現問題,A實例也會在同一個測試(並已提交)的單獨早期步驟中創建,並在稍後進行提取。這個由兩個新對象組成的關聯何時會變得糟糕? – 2009-11-23 10:25:23