2010-07-27 23 views
2

Je manipule ma classe de référentiel et tente d'exécuter une requête avec un critère détaché. Cependant, il ne semble pas que je mette le transformateur de résultat à un type non-AR.Utilisation de DetachedCriteria pour retourner une liste générique de type non-AR

public class IncidentRepository 
{ 
    public static IList<AuditReport> GetAllIncidentsToAudit() 
    { 
     DetachedCriteria dc = DetachedCriteria.For<Incident>("i") 
      .SetProjection(
       Projections.ProjectionList() 
        .Add(Projections.Property("i.Id"), "IncidentId") 
        .Add(Projections.Property("l.Id"), "LocationId") 
      ) 
      .CreateCriteria("Locations", "l") 
       .Add(Expression.Eq("l.PrimaryLocationFlag", "T")) 
      .SetResultTransformer(Transformers.AliasToBean<AuditReport>()); 

     return ActiveRecordMediator<AuditReport>.FindAll(dc); 
    } 
} 

public class AuditReport 
{ 
    public int IncidentId { get; set; } 
    public int LocationId { get; set; } 
} 

L'erreur que je reçois lors de l'exécution de cette requête est:

You have accessed an ActiveRecord class that wasn't properly initialized. There are two possible explanations: that the call to ActiveRecordStarter.Initialize() didn't include castle.AuditReport class, or that castle.AuditReport class is not decorated with the [ActiveRecord] attribute. 

Je comprends l'erreur, mais comment puis-je retourner une liste fortement typé d'un type non-AR? J'ai regardé ce que NHibernate.Transform offre mais rien ne ressort.

Aussi, est-ce une mauvaise pratique? Edit: J'ai réussi à le résoudre en accédant à la session de base de données sous-jacente et en exécutant mes critères à partir de là. Maintenant, je me demande, est-il un autre de

ISession sess = ActiveRecordMediator.GetSessionFactoryHolder(). 
     CreateSession(typeof(ActiveRecordBase)); 
    ICriteria criteria = sess.CreateCriteria<Incident>("i") 
     .SetProjection(
      Projections.ProjectionList() 
       .Add(Projections.Property("i.Id"), "IncidentId") 
       .Add(Projections.Property("l.Id"), "LocationId") 
     ) 
     .CreateCriteria("Locations", "l") 
      .Add(Expression.Eq("l.PrimaryLocationFlag", "T")) 
     .SetResultTransformer(Transformers.AliasToBean<AuditReport>()); 

    return criteria.List<AuditReport>(); 

y parvenir sans créer manuellement une nouvelle session?

Répondre

1

Si vous souhaitez utiliser une classe pour un résultat de transformation, vous devrez peut-être l'importer dans ActiveRecord.

Essayez décorer une classe AR avec (ou peut-être le AuditReport, mais il faudrait peut-être une classe décorée AR-):

[Import(typeof(AuditReport), "AuditReport")] 

Cela se traduirait par l'attribut d'importation NHibernate dans config xml.

Cette résoudre atleast lorsque l'aide d'une structure de classe dans HQL, comme ceci:

+0

Merci pour la réponse. J'ai malheureusement raté cette réponse au travail, donc je vais essayer demain. – Mike

+0

Peu importe où j'utilise l'attribut Import, il se plaint encore de faire référence à une classe non AR. En regardant la documentation, on dirait que l'attribut Import n'affecte que les requêtes écrites en HQL. http://www.castleproject.org/activerecord/documentation/v1rc1/manual/attributedocs/Generated_ImportAttribute.html – Mike

+0

Oh, d'accord, j'avais peur de ça. Eh bien, ça valait le coup. Active Record est un peu paralysé de plusieurs façons, et je pense que vous vous retrouverez à utiliser NHibernate directement de temps en temps (parce que vous ne pouvez pas contrôler le cache de second niveau ou utiliser HQL avec AR iirc. – jishi