Фон
Свободный NHibernate 1.1 (с реализацией репозитория с использованием LINQ to NHibernate) в проекте ASP.NET MVC 2 с использованием Ninject.
У меня есть сопоставленный класс (Station
)с коллекцией другого сопоставленного класса (Report
).Я также хотел бы, чтобы Station
имел вспомогательное свойство (MostRecentReport
), которое возвращает Report
для этого Station
с самой последней отметкой времени.
Частичная схема
Stations
--------
Id
Reports
---------
Id
StationId
Timestamp
Partial Code
public abstract class Entity
{
public virtual int Id { get; private set; }
}
public class Station : Entity
{
public virtual IList<Report> Reports { get; private set; }
public Station()
{
Reports = new List<Report>();
}
}
public class Report : Entity
{
public virtual Station Station { get; set; }
public virtual DateTime Timestamp { get; set; }
}
public StationMap : ClassMap<Station>
{
public StationMap()
{
Id(s => s.Id);
HasMany<Report>(s => s.Reports)
.Table("Reports")
.KeyColumn("StationId");
}
}
public ReportMap : ClassMap<Report>
{
public ReportMap()
{
Id(r => r.Id);
References<Station>(r => r.Station, "StationId");
Map(r => r.Timestamp);
}
}
Я наивно пытался добавить несопоставленное свойство, которое вернуло Reports.OrderByDescending(r => r.Timestamp).FirstOrDefault()
, но из-за этого "не удалось разрешить свойство: MostRecentReport" NHibernate.QueryException
s (даже если я не использую автоматическое сопоставление).Я также пытался реализовать его как метод с идентичным возвратом, но это вызывает исключения «Индекс вышел за пределы диапазона».
Есть ли способ заставить его работать с использованием свойства (предпочтительно) или метода?Или есть какой-то способ сопоставить его с Formula()
, возможно?
Обновление
Свободная конфигурация NHibernate (происходит в переопределении Load
моей реализации *1029*):
ISessionFactory sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(Settings.ConnectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Domain.Station>())
.BuildSessionFactory();