2011-11-12 7 views
0

У меня вопрос к вопросу this.игнорировать отношения HasMany программно?

Я использую Silverlight и WCF, где lazyloading не является вариантом. Как я могу игнорировать отношение HasMany программно в некоторых случаях улучшить производительность? (Я просто хочу, чтобы Foo без связанных баров).

ответ

1

В принципе, то, что вы пытаетесь сделать, невозможно, будь то NHibernate или Fluent. У вас не может быть картирования, говорящего «», иногда нагрузка, иногда нет ». Установка Not.LazyLoad() в значительной степени show stopper - NHibernate будет загружать коллекцию всегда, полностью.

Такая оптимизация (иногда нагрузка, иногда не) лучше подходит для обработки в DAO части вашей модели. Например, вы могли бы иметь свой FooDao класс вида:

public class FooDao 
{ 
    public IList<Foo> GetFoosEagerly() 
    { 
     // load all Foos first; then all Bars for every Foos 
     var foos = session.QueryOver<Foo>().List(); 
     foreach (var foo in foos) 
     { 
      NHibernateUtil.Initialize(foo.Bars); 
     } 

     return foos; 
    } 

    public IList<Foo> GetFooPerformanceCritical() 
    { 
     return session.QueryOver<Foo>().List(); 
    } 
} 

С стандартного отображения (как, не с использованием Not.LazyLoad()), первый метод будет возвращать FOOS с коллекцией Bars полностью набор (нам просто нужно скажите NHibernate, чтобы загрузить их сейчас, прежде чем мы вернемся). Тем не менее, второй из них вернет Foo объектов только. Ни один Bar не будет загружен. Вместо этого NHibernate будет генерировать прокси-объект вместо коллекции Bars для каждого Foo.

Ваш сервис WCF может использовать такой объект DAO внутри страны. Естественно, вы можете использовать аналогичные методы для загрузки одного Foo.

Заключение прост; Одно только сопоставление не поможет вам с вашей проблемой. Вам нужно сделать дополнительную работу по кодированию, но это определенно возможно.

+0

Я не совсем понял это. Когда я запрашиваю Foo, я автоматически получаю все связанные с ним Foo.Bars, так как у меня есть отображение HasMany (x => x.Bars) .Not.LazyLoad(); в моем файле сопоставления Foo. И да, как я писал, я использую службы WCF. – randoms

+0

@ randoms: Я понимаю, что вы имеете в виду. Короче; это невозможно. См. Мое редактирование, чтобы дать вам несколько идей, как преодолеть эту проблему. –

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