2010-09-22 2 views
0

У меня есть приложение, использующее Fluent NHibernate на стороне сервера для настройки базы данных. Fluent использует Lazyloading по умолчанию, но я явно отключил это, поскольку это дало мне проблемы при отправке объектов на клиентскую сторону. Очевидно, клиент не может загружать объекты лениво, так как он не имеет доступа к базе данных.Как обеспечить объекты ленивыми загрузками (Fluent) NHibernate?

Теперь я пытаюсь повторно подключить Lazyloading для частей моего datamodel, так как есть некоторые части, где я хочу только вернуть объекты верхнего уровня клиенту. Однако они не кажутся Lazyloaded. Зачем?!

Что я сделал, чтобы отключить LazyLoading, добавлялось Not.LazyLoading() в объекте сопоставления и по ссылкам в сопоставлении. Теперь удаление этого не похоже на эффект. Отладка Я вижу все объекты, на которые ссылаются, и я также получаю их все на стороне клиента. Тем не менее, NHibernateUtil.IsInitialized(myObjectFromDb.SomeReference) правильно говорит об ошибке одновременно. Так; как я могу обеспечить, чтобы объекты были ленивыми; получить объект, который не обращается к клиенту? Любые идеи, что я могу ошибаться?

У меня есть несколько классов (очень упрощенный пример ..):

public class Customer 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Order> Orders { get; set; } 
} 

public class Order 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<Item> Items { get; set; } 
} 

public class Item 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

Простые отображения - с использованием по умолчанию LazyLoading:

public class CustomerMapping : ClassMap<Customer> 
{ 
    public CustomerMapping() 
    { 
     Id(c => c.Id); 
     Map(c => c.Name); 
     HasMany(c => c.Orders); 
    } 
} 

public class OrderMapping : ClassMap<Order> 
{ 
    public OrderMapping() 
    { 
     Id(c => c.Id); 
     HasMany(c => c.Items); 
    } 
} 

public class ItemMapping : ClassMap<Item> 
{ 
    public ItemMapping() 
    { 
     Id(c => c.Id); 
     Map(c => c.Name); 
    } 
} 

И я принесу прямо вперед с Session.Load<Customer>(id) - возвращая результат по моей службе REST непосредственно без доступа к объекту, чтобы загружать ленивые ссылки. Как сразу после загрузки, так и на объекте, возвращаемом на сервер, загружаются ссылки. Как я могу это предотвратить?

+0

Я замечаю, что на самом деле я проверяю объект в отладке, который заставляет объект загружаться. После проверки IsInitialized возвращает true. Итак, я думаю, что это оболочка XML, сделанная WCF, которая заставляет объекты загружаться, но поскольку это выходит за рамки сеанса, я думал, что было поздно лениво загружать их? – stiank81

ответ

3

Проведено еще несколько исследований и испытаний. Lazy Loading оказывается как можно проще. Это поведение по умолчанию в сопоставлениях, поэтому ничего не говоря о нем, фактически приведет к тому, что объекты будут Lazy Loaded.

Вопрос: Когда они загружаются? Хорошо - если они Lazy Loaded, они будут загружаться всякий раз, когда кто-либо нуждается в них - в рамках сеанса. Так; проверка объекта в режиме Debug, чтобы проверить, загружена ли она, фактически вызовет загрузку объекта - лениво. Таким образом, инспектор покажет ссылки как загруженные, и все будет выглядеть нормально.

Проблема в моем случае была в том, что я упомянул о «в пределах сеанса». У меня есть клиент и сервер. Сервер предоставляет службы REST, и клиент вызывает их с помощью HttpClient. На сервере данные будут завернуты в XML, а затем возвращены. В моем случае сессия по-прежнему сохраняется, когда я возвращаю результат - это означает, что обертывание данных будет загружать ссылки лениво - при необходимости. Поэтому я получаю все ссылки, и весь объект возвращается клиенту.

So; чтобы гарантировать, что Lazy Loading с Fluent NHibernate просто не устанавливает ничего явно, а затем знайте, действительно ли вы используете ссылки на объекты, поскольку это приведет к их загрузке.

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