2012-01-22 46 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

相关问题