代码之家  ›  专栏  ›  技术社区  ›  Lobstrosity

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

  •  2
  • Lobstrosity  · 技术社区  · 16 年前

    背景

    在使用ninject的ASP.NET MVC 2项目中使用fluent nhibernate 1.1(使用linq to nhibernate实现存储库)。

    我有一个地图课( Station )与另一个映射类的集合( Report )我也想要 车站 拥有便利财产( MostRecentReport )它返回 报告 为此 车站 具有最新的时间戳。

    部分模式

    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() 但这导致“无法解决财产问题:mostrecenterport” NHibernate.QueryException S(即使我没有使用自动映射)。我还尝试将其实现为具有相同返回的方法,但这会导致“索引超出范围”异常。

    是否有一种方法可以使它与属性(首选)或方法方法一起工作?或者有什么方法可以把它映射到 Formula() 也许吧?

    更新

    流畅的NHibernate配置(发生在我的 NinjectModule 实施 Load 重写):

    ISessionFactory sessionFactory = Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008.ConnectionString(Settings.ConnectionString))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Domain.Station>())
        .BuildSessionFactory();
    
    2 回复  |  直到 16 年前
        1
  •  2
  •   Jay    16 年前

    没有理由必须映射这样的属性——如果不自动应用,nhibernate应该忽略它。

    我恰好同意大卫的回答,即您可能正在打破领域模型的抽象。

    也就是说,我认为答案是在某个地方(存储库?)有一个nhibernate查询(hql/criteria/linq)。正在尝试访问此属性。也就是说,问题不在映射中,而是在尝试使用 MostRecentReport 查询数据库/缓存时。

        2
  •  2
  •   David Lynch    16 年前

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

    推荐文章