2010-09-22 3 views
0

J'ai une application utilisant Fluent NHibernate côté serveur pour configurer la base de données. Fluent utilise Lazyloading par défaut, mais je l'ai explicitement désactivé car cela me donnait des problèmes lors de l'envoi des objets au client. Évidemment, le client ne peut pas charger les objets paresseusement car il n'a pas accès à la base de données.Comment s'assurer que les objets sont paresseux chargés avec (Fluent) NHibernate?

Maintenant, j'essaie de réactiver Lazyloading pour certaines parties de mon datamodel car il y a des parties où je veux seulement retourner des objets de toplevel au client. Cependant, ils ne semblent pas être Lazyloaded. Pourquoi?! Ce que j'ai fait pour désactiver LazyLoading a été d'ajouter Not.LazyLoading() dans l'objet de mappage et sur les références dans le mappage. Maintenant, enlever cela ne semble pas avoir d'effet. Débogage Je vois tous les objets référencés, et je les récupère tous du côté client. Cependant, le NHibernateUtil.IsInitialized(myObjectFromDb.SomeReference) dit correctement faux en même temps. Alors; comment puis-je m'assurer que les objets sont paresseux? obtenir un objet manquant ses références vers le client? Des idées sur ce que j'ai pu me tromper?

J'ai quelques classes (par exemple très simplifié ..):

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; } 
} 

applications simples - à l'aide LazyLoading par défaut:

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); 
    } 
} 

Et je vient le chercher avant droit avec un Session.Load<Customer>(id) - retour le résultat sur mon service REST directement sans accéder à l'objet de sorte que les références paresseuses sont chargées. Tous les deux juste après le chargement et sur l'objet retourné au côté du serveur les références sont chargées. Comment puis-je empêcher cela?

+0

Je remarque que c'est moi qui inspecte l'objet dans le débogage qui provoque le chargement de l'objet. Après avoir inspecté IsInitialized, renvoie true. Donc je suppose que c'est l'habillage XML fait par WCF qui provoque le chargement des objets, mais comme c'est en dehors de la portée de la session, j'ai pensé qu'il était trop tard pour les charger paresseusement. – stiank81

Répondre

3

Fait d'autres recherches et tests. Le chargement paresseux s'avère être aussi simple que prévu. C'est le comportement par défaut dans les mappings, donc ne rien dire à ce sujet provoquera réellement les objets à être Lazy Loaded.

La question est: Quand sont-ils chargés? Eh bien, s'ils sont paresseux, ils seront chargés chaque fois que quelqu'un en a besoin - dans le cadre de la session. Alors; inspecter l'objet en mode débogage pour vérifier s'il est chargé provoquera en fait le chargement de l'objet - paresseusement. Ainsi, l'inspecteur montrera les références comme chargées, et tout ira bien.

Le problème dans mon cas était ce que j'ai mentionné à propos de "dans la portée de la session". J'ai un côté client et serveur. Le serveur fournit des services REST et le client appelle ceux-ci à l'aide d'un HttpClient. Sur le serveur, les données seront enveloppées dans XML, puis retournées. Dans mon cas, la session se poursuit quand je renvoie le résultat - ce qui signifie que l'emballage des données chargera les références paresseusement - si nécessaire. Donc, je reçois toutes les références, et l'objet complet est renvoyé au client.

Ainsi; pour assurer le chargement paresseux avec Fluent NHibernate ne faites rien explicitement, et soyez conscient si vous utilisez réellement les références d'objets de quelque façon que ce soit qui va les charger.

Questions connexes