【问题标题】:Unmapped property in a mapped class (Fluent NHibernate 1.1)映射类中的未映射属性 (Fluent NHibernate 1.1)
【发布时间】:2010-07-27 23:52:02
【问题描述】:

背景

在使用 Ninject 的 ASP.NET MVC 2 项目中使用 Fluent NHibernate 1.1(使用 LINQ to NHibernate 实现存储库)。

我有一个映射类 (Station) 和另一个映射类 (Report) 的集合。我还希望 Station 有一个便利属性 (MostRecentReport),它返回带有最新时间戳的 StationReport

部分架构

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 =&gt; r.Timestamp).FirstOrDefault() 的未映射属性,但这会导致“无法解析属性:MostRecentReport”NHibernate.QueryExceptions(即使我没有使用自动映射)。我也尝试将其实现为具有相同返回的方法,但这会导致“索引超出范围”异常。

有没有办法让它与属性(首选)或方法方法一起工作?或者有什么方法可以用Formula() 映射它?

更新

Fluent NHibernate 配置(发生在我的NinjectModule 实现的Load 覆盖):

ISessionFactory sessionFactory = Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008.ConnectionString(Settings.ConnectionString))
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Domain.Station>())
    .BuildSessionFactory();

【问题讨论】:

  • 让我们看看配置 NHibernate 的代码。自动地图可能潜伏在某处。
  • 使用 Fluent NHibernate 配置更新问题。

标签: c# fluent-nhibernate


【解决方案1】:

没有理由你必须像这样映射一个属性——如果你不自动映射,NHibernate 应该忽略它。

我碰巧同意 David 的回答,您可能会破坏域模型的抽象。

也就是说,我认为答案是您在某处(存储库?)有一个 NHibernate 查询 (HQL/Criteria/LINQ) 正在尝试访问此属性。也就是说,问题不在于映射,而在于在查询数据库/缓存时尝试使用MostRecentReport

【讨论】:

  • 是的,我在 IQueryable 约束中无知地使用了 MostRecentReport,而 NHibernate 正在抱怨它,因为它没有被映射。你说的都是对的,这是一个不必要的财产。经过我的思考,这是一个非常简单的查询,可以从 Reports 角度而不是 Stations 角度获取相同的数据。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多