使用Ninject在ASP.NET MVC 2项目中使用流畅的NHibernate 1.1(使用LINQ到NHibernate的存储库实现)。
我有一个映射类(Station
),其中包含另一个映射类(Report
)的集合。我还希望Station
有一个便利属性(MostRecentReport
),它返回Report
Station
的最新时间戳。
Stations
--------
Id
Reports
---------
Id
StationId
Timestamp
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()
映射它,也许?
Fluent NHibernate配置(发生在NinjectModule
实现的Load
覆盖中):
ISessionFactory sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(Settings.ConnectionString))
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Domain.Station>())
.BuildSessionFactory();
答案 0 :(得分:2)
我不确定向您的实体添加未映射的属性是个好主意。通过向ViewModel添加便利属性并使用存储库查询来获取值,可以更好地分离关注点。
答案 1 :(得分:2)
没有理由你必须映射这样的属性 - 如果你没有自动化,NHibernate应该忽略它。
我恰好同意David的回答,你可能会破坏域模型的抽象。
那就是说,我认为答案是你在某个地方(存储库?)试图访问这个属性的NHibernate查询(HQL / Criteria / LINQ)。也就是说,它不是映射中的问题,而是在查询数据库/缓存时尝试使用MostRecentReport
。