2012-08-31 41 views
1

這似乎是將所有數據庫調用放入事務的最佳實踐。所以,我想在交易中選擇一個動作,但我找不到如何操作。如何在NHibernate中的事務中進行檢索操作?

我曾嘗試這個代碼,但我得到一個錯誤:

using (var session = GetSession().SessionFactory.OpenSession()) 
using (var transaction = session.BeginTransaction()) 
{ 
    // var session = GetSession(); 
    var result = session.Query<I>().Where(condition); 

    transaction.Commit(); 

    return result; 
} 

錯誤:

Session is closed! Object name: 'ISession'.

回答

3

這不是Transaction本身的問題,雖然我只用交易的保存/更新調用,不選擇,但這可能是一個偏好問題(或者我根本不知道重要的事情)。

問題是,在關閉會話之前,您沒有'收集'集合。 這應該工作:

var result = session.Query<I>.Where(condition).List(); 

return result; 

Where本身並不做任何事情。這意味着你只是推遲執行過濾器,直到你做了某事與它 - 例如,迭代它。如果你當時不在會話範圍內(看起來你是),那麼你會得到異常,因爲當會話關閉時你無法調用數據庫。

雖然你可能不能夠訪問延遲加載的子項,而不急於Fetch第一荷蘭國際集團他們 - 當你打開的會話裏面不是你無法通過代理調用數據庫。 :)

免責聲明

順便說,同樣的事情會在EF發生與LINQ:

IEnumerable<I> myObjects; 

using(var context = new MyDbContext()) 
{ 
    myObjects = context.Set<I>.Where(x => x.Name == "Test"); 
} 

foreach(obj in myObjects) 
{ 
    var name = obj.Name; //BOOM! Context is disposed. 
} 
+1

關於最初的一句話:保存/更新調用不(總是)觸發到寫數據庫。更重要的是,它們不是導致寫作的唯一方式。使用NHibernate默認設置,如果會話中加載的對象已被修改並且可能影響查詢結果,則任何查詢都可能觸發寫入操作。 –

相關問題