2010-05-15 9 views
1

У меня есть следующий метод в моем репозитории. Это отлично работает, мои параметры orderItems инициализируются, как и планировалось, однако orderItems содержит другую коллекцию под названием OrderItemAddress. Они не инициализируются. Как мне это сделать?nhibernate: как инициализировать объекты списка дочерних объектов

public Model.Order Get(int id) 
{ 
    using (ISession session = NHibernateHelper.OpenSession()) 
    { 
     Model.Order order = session 
      .CreateCriteria(typeof(Model.Order)) 
      .Add(Restrictions.Eq("Id", id)) 
      .UniqueResult<Model.Order>(); 

     NHibernateUtil.Initialize(order.OrderItems); 
     return order; 
    } 
} 
+0

Могу ли я спросить, почему OrderItemAddress является коллекцией? – asgerhallas

ответ

5

Прежде всего, вы можете выдать только один запрос к серверу БД с помощью соединения, а не инициализировать коллекцию после порядка забирается, как это:

public Model.Order Get(int id) 
{ 
    using (ISession session = NHibernateHelper.OpenSession()) 
    { 
     Model.Order order = session 
      .CreateCriteria(typeof(Model.Order)) 
      .Add(Restrictions.Eq("Id", id)) 
      .SetFetchMode("OrderItems", FetchMode.Join) 
      .UniqueResult<Model.Order>(); 

     return order; 
    } 
} 

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

var orderCriteria = DetachedCriteria.For<Order>() 
    .SetFetchMode("OrderLines", FetchMode.Eager) 
    .Add(Restrictions.Eq("Id", orderId)); 

var orderLinesCriteria = DetachedCriteria.For<OrderLine>() 
    .CreateAlias("Order", "order") 
    .SetFetchMode("Addresses", FetchMode.Eager) 
    .Add(Restrictions.Eq("order.Id", orderId)); 

IList list = s.CreateMultiCriteria() 
    .Add(orderCriteria) 
    .Add(orderLinesCriteria) 
    .List(); 

var order = ((IList)list[0]).Cast<Order>().First(); 

Это, к сожалению, еще не испытано, я могу сделать это позже. Идея состоит в том, чтобы сделать многоэлемент, который получает все необходимые сущности за один раз (возможно, это не самый эффективный db-запрос, но это, по крайней мере, только одна поездка), а затем пусть сеанс сшит фактический график из двух наборы результатов.

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

EDIT: Вышеупомянутый код изменен на то, что действительно работает и в настоящее время протестировано. Извините за переименование сущностей и коллекций. Я немного переименовал их в свой тестовый проект.

+0

круто спасибо, я дам ему вращение. – frosty

+0

Должно быть, я устал. Исправлен запрос, чтобы на самом деле поступать правильно. И проверено. – asgerhallas

+0

да! спасибо, отличная работа. – frosty

Смежные вопросы