Привязка прокси-объектов NHibernate к DataGridView - PullRequest
0 голосов
/ 22 января 2012

Я пытаюсь привязать объекты, извлеченные из сеанса 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 вызывает проблемы с привязкой данных , но ему уже несколько лет, и с тех пор NHibernate сильно изменился. Есть ли новые или лучшие решения этой проблемы сейчас?

Заранее спасибо.

Редактировать Я отправил другой вопрос после того, как получил некоторое понимание от этой почты. Я также нашел простое решение проблемы - вы можете увидеть его здесь: Привязка коллекции объектов к ComboboxColumn в DataGridView

1 Ответ

1 голос
/ 22 января 2012

NHibernate делает то, что вы просили.В своем картографическом файле вы говорите NH не приводить ассоциации.Даже если вы привезете все связанные классы, у NH все еще есть свои заказы.

Если вы хотите, чтобы NHibernate стремился загрузить класс 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.

Перейти к отображению, в котором вы установили модель, а затем сделать и изменитьthe lazy = "false".

Теперь, каждый раз, когда вы выбираете объект Car, Модель и Марка будут вместе.Это решение влияет на другие запросы, основанные на сопоставлении файлов.

Надеюсь, это поможет вам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...