2010-10-15 4 views
0

Im довольно новый для nhibernate, так что это может быть довольно просто, но я havent нашел ответ в Интернете.Возвратите только родителя, используя nHibernate

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

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

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

ответ

3

Определите класс 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

Выглядит интересно, я использую fluentnhibernate и im довольно новый для nhibernate в целом. Есть ли способ добиться того же результата, используя беглость? – SecretDeveloper

+1

Fluent NHibernate - вспомогательный элемент отображения. Это решение, представленное выше, является запросом и не входит в сферу действия Fluent NHibernate. –

+0

Да, это сработало. Благодарю. – SecretDeveloper

0

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

Вариант 1

Пересмотреть отображение сумка - Может быть, просто выбрав другую стратегию исправит проблему. Я ответил на вопрос о различных сопоставлениях коллекции до List vs Set vs Bag in 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; } 
Смежные вопросы