Я возился со своим классом репозитория и попытался выполнить запрос с независимыми критериями.Тем не менее, мне не нравится устанавливать преобразователь результата не 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; }
}
Ошибка, которую я получаю при выполнении этого запроса:
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.
Iпонимаю ошибку, но как я могу вернуть строго типизированный список не-AR типа?Я посмотрел на то, что предлагает NHibernate.Transform, но ничего не выделяется.
Кроме того, делает ли это плохую практику?
Редактировать: мне удалось решить ее, получив доступ к базовой сессии базы данныхи выполнение моих критериев оттуда.
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>();
Теперь мне интересно, есть ли другой способ достичь этого без ручного создания нового сеанса?