2008-10-20 5 views
8

Je voudrais savoir s'il existe un moyen de désactiver le chargement automatique des enregistrements enfants dans nHibernate (pour un: plusieurs relations).nhibernate - désactive le chargement automatique paresseux des enregistrements enfant pour une ou plusieurs relations

Nous pouvons facilement désactiver le chargement paresseux sur les propriétés, mais ce que je veux, c'est désactiver tout type de chargement automatique (paresseux et non paresseux à la fois). Je veux seulement charger des données par requête (c.-à-d. HQL ou Criteria)

Je voudrais toujours définir la relation entre les enregistrements enfant-parents dans le fichier de mappage pour faciliter HQL et être en mesure de rejoindre les entités enfants-parents, mais je ne veulent que les enregistrements enfants soient chargés dans le cadre de l'enregistrement parent, sauf si une requête sur l'enregistrement parent indique explicitement que (par le biais de fetch impatient, etc). Exemple: L'extraction de l'enregistrement du service à partir de la base de données ne doit pas extraire tous les enregistrements d'employés de la base de données, car il ne sera peut-être jamais nécessaire.

Une option ici est de définir la collection Employés sur Département comme charge paresseuse. Le problème avec cette approche est qu'une fois que l'objet est donné à l'API appelante, il peut 'toucher' la propriété de chargement paresseux et cela récupérera la liste entière à partir de la base de données.

J'ai essayé d'utiliser 'expict' - pour déconnecter l'objet mais il ne semble pas fonctionner à tout moment et ne fait pas d'expulsion profonde sur l'objet. Plus il abstrait le type de propriété chargé paresseux avec une classe proxy qui joue des ravages plus tard dans le code où nous essayons d'opérer sur l'objet par réflexion et il rencontre le type non dépensé sur l'objet. Je suis un débutant à nHibernate, des pointeurs ou de l'aide serait d'une grande aide.

+0

Vous avez une faute de frappe: disbale -> Désactiver – Anthony

Répondre

3

Compte tenu de votre demande, vous pouvez simplement ne pas mapper de département aux employés, ni avoir une propriété des employés sur votre département. Cela signifie que vous devez toujours faire une base de données pour trouver les employés d'une base de données.

Aplogies si ces exemples de code ne fonctionnent pas hors de la boîte, je ne suis pas près d'un compilateur au moment

Ainsi, votre classe département pourrait ressembler à:

public class Department 
{ 
    public int Id { get; protected set; } 
    public string Name { get; set; } 
    /* Equality and GetHashCode here */ 
} 

et votre employé ressemblerait à ceci:

public class Employee 
{ 
    public int Id { get; protected set; } 
    public Name Name { get; set; } 
    public Department Department { get; set; } 
    /* Equality and GetHashCode here */ 
} 

Chaque fois que vous vouliez trouver des employés pour un service, vous avez devez appeler:Simplement parce que votre spécification dit «Les départements ont beaucoup d'employés», cela ne signifie pas que vous devez le représenter comme une association bidirectionnelle. Si vous pouvez garder votre uni-directionnel associé, vous pouvez vraiment obtenir votre accès aux données à voler aussi.

Google "Domain Driven Design" Aggregate, ou voir la page 125 du livre d'Eric Evan sur Domain Driven Design pour plus d'informations

-1

Vous pouvez avoir l'attribut paresseux sur la collection. Dans votre exemple, le département a n employés, si la paresse est activée, les employés ne seront pas chargés par défaut lorsque vous chargez un département: http://www.nhforge.org/doc/nh/en/#collections-lazy

Vous pouvez avoir des requêtes qui chargent explicitement le département ET les employés ensemble. C'est l'option "récupérer": http://www.nhforge.org/doc/nh/en/#performance-fetching-lazy

+0

Dans le cas où la requête ne veut pas chercher les employés du tout -le les problèmes sont les employés accidentellement paresseux chargés si l'api appelant accède au getter. Il peut s'agir d'un glissement de performance et s'il y a un moyen de l'éteindre. Dans mon message j'ai mentionné quelques problèmes que j'ai rencontrés en expulsant l'objet – dotnetcoder

Questions connexes