2010-09-04 2 views
3
public Parent GetByName(string Name) 
{ 
    return _session.CreateCriteria<Parent>() 
     .Add(Restrictions.Eq("Name", Name)) 
     .SetFetchMode("Children", FetchMode.Eager) 
     .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
     .UniqueResult<Parent>(); 
} 

public ParentDetailVM GetMeAParent(string Name) 
{ 
    Parent parent; 
    using (var tx = _session.BeginTransaction()) 
    { 
     //This works well, one single query loading 
     //both parent and children 
     parent = _parentRepository.GetByName(Name); 

     //If I include this as suggested by NHProfiler 
     //it all of the sudden sends a new query for each child 
     //and a query for the grandchildren collection 
     tx.Commit(); 
    } 

    return Mapper.Map<Parent, ParentDetailVM>(parent); 
} 

J'ai vérifié pour m'assurer que rien dans les fichiers de mappage n'a été défini pour charger vivement. Je ne peux pas comprendre pourquoi cela fonctionne si je laisse la validation de transaction, mais sinon, N questions plus. Quelqu'un sait pourquoi cela pourrait se produire?Obtenir plusieurs requêtes lorsque la transaction est validée, pourquoi?

Répondre

0

Si vous examinez _session.IsDirty() avant de valider la transaction, mon pari est qu'il retournera vrai. Lorsque la transaction est validée, la session est vidée et, pour une raison quelconque, les objets enfants sont chargés pour mettre en cascade la modification.

Il s'agit d'un problème connu sous le nom de «fantôme» ou de mises à jour fantômes. Un scénario typique est qu'une colonne de base de données est un int nullable mais la propriété d'objet correspondante est non nullable. Lorsqu'un enregistrement avec une valeur nulle est récupéré, NHibernate définit la valeur de la propriété sur 0 et l'objet est donc sale. Le moyen le plus rapide pour résoudre ce problème est d'activer la mise à jour dynamique de l'objet en utilisant dynamic-update="true" dans les mappages XML, DynamicUpdate() en cours et d'utiliser un profileur ou une connexion pour voir quelles colonnes sont mises à jour après la sélection. Il y a aussi un utilitaire appelé Ghostbuster que vous pouvez inclure dans les tests unitaires.

+0

Cela a beaucoup de sens, les données sont assez approximatives. Je vais regarder dans et voir ce que je trouve. –

Questions connexes