Можно ли в NHibernate иметь запрос, возвращающий сопоставленный объект, который частично заполнен данными (остальные загружаются лениво)? - PullRequest
0 голосов
/ 11 августа 2011

В моей прежней базе данных есть гигантская таблица с более чем 40 столбцами. Я хотел бы иметь возможность частично заполнить мой гигантский отображенный класс данными, поэтому я получаю только те данные, которые мне нужны. Как я могу запросить у nhibernate вернуть мой гигантский сопоставленный объект, который имеет только те свойства, которые я хочу заполнить?

Еще лучше: если мне понадобится еще одно свойство, которое не будет заполнено ... оно будет загружено лениво.

Возможно ли это?

Спасибо!

Isaac

Ответы [ 3 ]

1 голос
/ 11 августа 2011

Да, это возможно.

http://ayende.com/blog/4377/nhibernate-new-feature-lazy-properties

Манипулятор байтового кода может быть довольно мощным.Согласно этой статье только Замок один поддерживает это, но это был год.Я бы угадал Ли сейчас поддерживает это.

И ДАЖЕ, если это не сработало.Должно быть довольно просто превратить каждое свойство в свой собственный класс отображения, на который будет влиять ленивый загрузчик.Это не идеально, но это будет обходной путь, если он еще не поддерживает ленивые свойства.К счастью, кажется, что NHibernate делает.

1 голос
/ 11 августа 2011

Это возможно с Fluent NHibernate, поэтому я предполагаю, что это с NHibernate.Этот код будет работать для FNH (и я извиняюсь, но я не знаю эквивалента NHibernate, но если вы знаете файлы HBM, вы сможете его обработать).

У вас есть два способа сделать этолибо загрузите все как ленивые по умолчанию, а затем укажите свойства, которые вы хотите загрузить полностью отдельно, или наоборот, где все свойства загружаются по умолчанию, и вы укажите те, которые хотите быть ленивыми.

Примеротображение для первого параметра (в FNH, опять же, извините) будет выглядеть примерно так:

public partial class ActionableEventMap : SubclassMap<ActionableEvent>
{
    public ActionableEventMap()
    {
        References(x => x.Branch).Access.Property();
        References(x => x.Department).Access.Property();
        Map(x => x.Cost).Not.LazyLoad().Access.Property();
        Map(x => x.PurchaseOrderNumber).Not.LazyLoad().Access.Property();
        References(x => x.UserQualification).Access.Property();
    }
}

Обратите внимание, как можно указать свойство lazy индивидуально

Редактировать: собственно, вотHBM

<property access="property" name="LastReminder" type="System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" lazy="false">
  <column name="LastReminder" />
</property>
<property access="property" name="CCEmailString" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" lazy="false">
  <column name="CCEmailString" />
</property>
1 голос
/ 11 августа 2011

Лучше всего будет проецировать отдельные свойства в вашем запросе.Насколько я знаю, NHibernate не позволяет лениво загружать отдельные свойства.

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