我正在尝试将从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
答案 0 :(得分:1)
NHibernate正在按照你的要求做。 在您的映射文件中,您告诉NH不要带来关联。即使你带上了所有相关的课程,NH仍然有它的命令。
如果你想让NHibernate急切加载你的Car中的Make和Model类,你有两种方法可以做到:
第一个很容易。你只需要做一个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都会在一起。此解决方案会影响依赖映射文件的其他查询。
我希望它可以帮到你!