【问题标题】:Binding NHibernate Proxy Objects to a DataGridView将 NHibernate 代理对象绑定到 DataGridView
【发布时间】:2012-01-22 04:52:14
【问题描述】:

我正在尝试将从 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

【问题讨论】:

    标签: vb.net nhibernate datagridview fluent-nhibernate


    【解决方案1】:

    NHibernate 正在按照您的要求进行操作。 在您的映射文件中,您告诉 NH 不要带来关联。即使你带了所有相关的课程,NH仍然有它的订单。

    如果您希望 NHibernate 从您的 Car 中快速加载 Make 和 Model 类,您有两种方法可以做到:

    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();
    

    这个查询将把这个时间带入 Car 和两个相关的类(Model 和 Make)。

    第二个比第一个更容易,但要小心,它可能会给你带来 N+1 个选择的麻烦。

    转到您设置模型和制作的映射并更改lazy="false"。

    现在,每次您获取 Car 对象时,Model 和 Make 都会在一起。此解决方案会影响其他依赖映射文件的查询。

    希望对你有帮助!

    【讨论】:

    • 这是有道理的,但似乎并不能解决问题。我已经单步执行了代码并观察了它的执行情况,并且我还尝试简单地执行一个 .Fetch()。即使查询继续并再次从数据库请求完整数据(即使它仍在缓存中),它仍然会产生代理对象。还有其他想法吗?
    • 感谢您的建议。我误解了 NHibernate 的部分内容,也没有完全理解我读过的一些博客文章。我遇到的问题似乎更加以数据绑定为中心。一旦我处理了那个红鲱鱼,我会再看看它的 NHibernate 方面。
    • 又是我的 2 美分 :) 我不建议您直接在 GUI 组件(Datagrids、DropDown 等)中使用 NHibernate 映射实体。它可能会导致您遇到选择 N+1(再次)或更糟糕的情况:如果您的 ISession 对象在运行时关闭,您可能会遇到异常。
    • 谢谢。我知道这些问题并已采取措施消除它们。所有数据都不会延迟加载到 GUI 中,并且 ISession 在 GUI 的生命周期内保持活动状态。
    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 2017-08-30
    • 2011-08-22
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多