我试图绑定从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
这是有道理的,但它似乎并没有解决问题。我已经浏览了代码并观察了这个代码被执行了,我也试着简单地做一个.Fetch()。它仍然会导致代理对象,即使查询继续并再次从数据库请求完整数据(即使它仍在缓存中)。任何其他想法? – Origin
谢谢您的建议。我误解了NHibernate的部分内容,也没有完全理解我读过的一些博客文章。我遇到的问题似乎更多的是以数据绑定为中心。一旦我处理了这个红鲱鱼,我会再看看NHibernate的一面。 – Origin
只需要我的2美分:) 我不建议你直接在你的GUI组件(Datagrids,DropDown等)中使用你的NHibernate映射实体。 它可能会导致您遇到问题,如选择N + 1(再次)或甚至更糟糕的情况:如果您的ISession对象在运行时关闭,则可以获取异常。 – cidico