2012-01-22 48 views
0

我試圖綁定從NHibernate會話拉到DataGridView的對象,並遇到問題。將NHibernate代理對象綁定到DataGridView

我有一個會話,在該會話中,我獲取所有綁定到組合框的「查找」項目,然後查詢對象本身。不知何故,這仍然導致主對象上的代理子對象。我甚至將查找項目的映射更改爲渴望獲取,但我仍然以某種方式獲取代理。

這裏是我正在獲取的對象:

Dim _makes As IList(Of Make) = session.QueryOver(Of Make).List 
Dim _models As IList(Of Model) = session.QueryOver(Of Model).List 
Dim _cars as IList(of Car) = session.QueryOver(of Car).List 
' A car has a .Make and a .Model that are picked from a DGV ComboBox Column 

,因爲我去通過他們的會議不會查詢汽車的品牌或型號的數據庫,因爲它認爲它已經在其高速緩存。如果是這樣的話 - 爲什麼它是代理對象呢?

由於我似乎無法避免代理,我想知道什麼是將這些對象綁定到DataGridView的最佳方法是。

我見過幾篇文章討論這個問題,例如:NHibernate proxy causing problems with databinding,但它已經過了幾年了,從那以後NHibernate發生了很大的變化。現在是否有任何新的或更好的解決方案解決這個問題?

在此先感謝。

編輯 我從這篇文章得到一些見解後發佈了另一個問題。我也發現了一個簡單的解決方案 - 你可以在這裏看到:Binding a collection of objects to a ComboboxColumn in a DataGridView

回答

1

NHibernate正在做你所問。 在你的映射文件中,你告訴NH不帶關聯。即使你帶來了所有相關的課程,NH仍然有它的訂單。

如果你想NHibernate的渴望負荷從你的車的品牌和型號類,你有兩種方式來做到這一點:

  1. 如果你只需要這些對象,不時,更改查詢;
  2. 如果您在處理Car類時總是需要這些對象,更改您的映射;

第一個很容易。你只需要做一個JoinAlias和NH帶來的對象,你是這樣的:

Car carAlias = null; 
Model modelAlias = null; 
Make makeAlias = null; 

var query = Session.QueryOver<Car>(()=> carAlias) 
      .JoinAlias(()=> carAlias.Model,()=> modelAlias) 
      .JoinAlias(()=> carAlias.Make,()=> makeAlias) 
      .Where(()=> carAlias.Id == 101).SingleOrDefault(); 

這個查詢將帶來這一次的汽車和兩個關聯類(型號和生產)。

第二個比第一個更容易,但要小心,它可能會導致你陷入N + 1選擇的困境。

轉到您的映射,您將其設置爲模型和製作並更改lazy =「false」。

現在,每次您獲取Car對象時,Model和Make都會在一起。此解決方案會影響依賴映射文件的其他查詢。

我希望它能幫助你!

+0

這是有道理的,但它似乎並沒有解決問題。我已經瀏覽了代碼並觀察了這個代碼被執行了,我也試着簡單地做一個.Fetch()。它仍然會導致代理對象,即使查詢繼續並再次從數據庫請求完整數據(即使它仍在緩存中)。任何其他想法? – Origin

+0

謝謝您的建議。我誤解了NHibernate的部分內容,也沒有完全理解我讀過的一些博客文章。我遇到的問題似乎更多的是以數據綁定爲中心。一旦我處理了這個紅鯡魚,我會再看看NHibernate的一面。 – Origin

+0

只需要我的2美分:) 我不建議你直接在你的GUI組件(Datagrids,DropDown等)中使用你的NHibernate映射實體。 它可能會導致您遇到問題,如選擇N + 1(再次)或甚至更糟糕的情況:如果您的ISession對象在運行時關閉,則可以獲取異常。 – cidico

相關問題