Вернуть только Родителя, используя nHibernate - PullRequest
0 голосов
/ 15 октября 2010

Я довольно новичок в nhibernate, так что это может быть довольно просто, но я пока не нашел ответа в Интернете.

Допустим, у меня есть родительский класс и детский класс. Родительский класс может иметь много дочерних классов, связанных с ним. Теперь, когда я пытаюсь загрузить определенный родительский объект, nhibernate также заполняет его дочернюю коллекцию для меня. Есть ситуации, когда я хочу просто вернуть родительский класс без дочерней коллекции.

Я знаю, что могу включить отложенную загрузку, но это не сработает, так как я сериализую Parent в XML. Сериализатор XML не может работать с nhibernate PersistanceBag, который содержит коллекцию Child.

Так есть ли способ определения класса Parent, скажем, ParentView, который работает с той же таблицей, но содержит только свойства Parent, но не все его дочерние элементы и внуки?

Ответы [ 2 ]

3 голосов
/ 15 октября 2010

Определите класс ParentView, который содержит столбцы, которые вам нужно получить. Убедитесь, что в этом классе есть один конструктор без параметров.

ISession session = NHibernateHelper.Session;
ISQLQuery query = session.CreateSQLQuery("select Parent_ID, Name form Parent where Parent_ID = :parentID");
query.SetInt32("parentID", parentID);
IList<ParentView> parentView = query.SetResultTransformer(Transformers.AliasToBean<ParentView>()).List<ParentView>();
return parentView;
0 голосов
/ 15 октября 2010

Альтернатива созданию класса представления и связанного с ним запроса в соответствии с предложением sh_kamalh (которое я бы рассмотрел на вашем месте).Если проблема связана именно со структурой сопоставления сумок, то у вас может быть несколько более простых решений:

Вариант 1

Пересмотрите сопоставление сумок - возможно, просто выберитедругая стратегия решит проблему.Я уже ответил на вопрос о различных сопоставлениях коллекций до Список против Set против Bag в NHibernate . Лично я обнаружил, что часто использую стратегию Set.Чтобы отобразить другую стратегию в Fluent NHibernate, используйте следующее в качестве переопределения:

mapping.HasMany<Child>(x => x.Children).ToSet();

или

mapping.HasMany<Child>(x => x.Children).ToList();

Опция 2

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

[System.Xml.Serialization.XmlIgnore]
public IEnumerable<Child> Children { get; internal set; }
...