2010-03-19 7 views
0

J'utilise NHibernate 2.0.1 et .NET Je suis face à des problèmes avec Lazy charger une associationLazy Loading Association et casting

J'ai une classe BusinessObject qui a des associations à d'autres BusinessObject en elle, et il peut aller Plus profond.

La fonction suivante est dans BusinessObject pour lire les valeurs d'une collection dans BusinessObject.

public virtual object GetFieldValue(string fieldName) 
    { 
     var fieldItems = fieldName.Split(AppConstants.DotChar); 
     var objectToRead = this; 
     for (var i = 0; i < fieldItems.Length - 1; i++) 
     { 
      objectToRead = (BusinessObject) objectToRead.GetFieldValue(fieldItems[i]); 
     } 
     //if (objectToRead._data == null) return objectToRead.SystemId + " Error: _data was null"; 
     return objectToRead.FieldValue(fieldName.LastItem()); 
    } 

La fonction FieldValue est décrite ci-dessous

private object FieldValue(string fieldName) 
    { 
     return _data.Contains(fieldName) ? _data[fieldName] : null; 
    } 

Le BusinessObject a un dictionnaire _data qui stocke les valeurs de champ.

Assumer le fieldName est BusinessDriver.Description et le BusinessObject qui a ce domaine est StrategyBusinessDriver

Ce code se décompose le nom du champ en deux - BusinessDriver & Description. La première itération lit l'objet BusinessDriver de StrategyBusinessDriver. Il est jeté dans un type BusinessObject afin que je puisse appeler à nouveau le GetFieldValue pour lire le champ suivant, c'est-à-dire Description dans le BusinessDriver. Le problème est que lorsque je lis le BusinessDriver lors de la première itération et que je le lance, j'obtiens les identifiants et tous les autres détails de BusinessObject mais le dictionnaire de champs _data et les autres collections ne sont pas récupérées. Cela devrait être récupéré paresseusement lorsque je lis la _data de BusinessObject. Cependant, cela ne se produit pas et j'obtiens une erreur que _data est null.

Y at-il quelque chose de mal codé en raison de laquelle la collection n'est pas récupérée paresseusement? S'il vous plaît demander pour plus de précisions si nécessaire. Merci d'avance.

MISE À JOUR: J'ai un peu plus de perspicacité dans le problème. Le code permettant de charger les champs de BusinessObject n'est pas chargé paresseusement si la fonction est appelée récursivement dans BusinessObject. Si je déplace cette logique hors de BusinessObject, le chargement paresseux fonctionne! Existe-t-il un moyen de travailler dans BusinessObject?

MISE À JOUR: fichier de mappage

<joined-subclass name="Japt.Core.Domain.Data.BusinessObject, Japt.Core, Version=0.0.1608.0, Culture=neutral, PublicKeyToken=null" table="BusinessObject_BusinessDriverStrategyMap" entity-name="BusinessDriverStrategyMap"> 
    <key column="SystemId" /> 
    <dynamic-component name="_data" insert="true" update="true" optimistic-lock="true"> 
    <many-to-one class="Japt.Core.Domain.Data.BusinessObject, Japt.Core, Version=0.0.1608.0, Culture=neutral, PublicKeyToken=null" name="Strategy" entity-name="Strategy"> 
     <column name="Strategy" /> 
    </many-to-one> 
    <many-to-one class="Japt.Core.Domain.Data.BusinessObject, Japt.Core, Version=0.0.1608.0, Culture=neutral, PublicKeyToken=null" name="BusinessDriver" entity-name="BusinessDriver"> 
     <column name="BusinessDriver" /> 
    </many-to-one> 
    </dynamic-component> 
    <dynamic-component name="_collections" insert="true" update="true" optimistic-lock="true" /> 
</joined-subclass> 

Répondre

0

Je pense avoir trouvé le fond de ce problème. Puisque j'essaye de lire paresseusement des propriétés d'un objet dans le même objet, il n'est pas capable de charger ces propriétés paresseusement. Lorsque j'ai déplacé ce code en utilisant une méthode d'extension, la lecture de la propriété n'était pas dans la portée du même objet, c'est pourquoi cela a fonctionné.

0

est StrategyBusinessDriver un BusinessObject? pouvez-vous poster votre cartographie? est _data une propriété publique ou un domaine privé? parce que le proxy doit remplacer son getter ...

+0

Oui, StrategyBusinessDriver est également un BusinessObject. Je joins le fichier de mappage ci-dessus. _data est un champ privé. Cependant, c'est un dictionnaire et est utilisé pour mapper des composants dynamiques.(J'ai des colonnes dynamiques) – Zuber

+0

Je ne sais pas comment joindre un fichier et l'ensemble du fichier de mappage n'est pas accepté dans le code de balisage – Zuber