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?
Merci pour la réponse. J'ai malheureusement raté cette réponse au travail, donc je vais essayer demain. – Mike
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
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