映射类中的未映射属性(Fluent NHibernate 1.1)

时间:2010-07-27 23:52:02

标签: c# fluent-nhibernate

背景

使用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();

2 个答案:

答案 0 :(得分:2)

我不确定向您的实体添加未映射的属性是个好主意。通过向ViewModel添加便利属性并使用存储库查询来获取值,可以更好地分离关注点。

答案 1 :(得分:2)

没有理由你必须映射这样的属性 - 如果你没有自动化,NHibernate应该忽略它。

我恰好同意David的回答,你可能会破坏域模型的抽象。

那就是说,我认为答案是你在某个地方(存储库?)试图访问这个属性的NHibernate查询(HQL / Criteria / LINQ)。也就是说,它不是映射中的问题,而是在查询数据库/缓存时尝试使用MostRecentReport