NHibernate 1:n有限制地映射到1:1

时间:2011-08-07 09:31:55

标签: c# .net nhibernate mapping nhibernate-mapping

我的申请是这样的:

  1. 我有一个产品
  2. 我有用户跟踪此产品,因此上课跟踪
  3. 注意多个用户可以跟踪一个产品,因此Product:Track之间的关系是1:n

    但是,如果用户当前已登录,则只能 1 跟踪与产品相关联的跟踪,并且在我的列表页面中,我应该显示产品列表及其当前用户的跟踪状态,类似的东西:

    • 产品A - 追踪2011-01-01
    • 产品B - 未跟踪
    • 产品C - 追踪2010-12-20
    • ...

    因此在普通的SQL中,我可能有这样的查询:

    select * from Product as p 
    left outer join Track as t 
        on t.ProductId = p.Id and t.UserId = {currentUser.Id}
    

    但是使用NHibernate我发现它实现起来并不容易,目前我有一个 ProductWithTrack 类,它继承自 Product 类并添加 Track 财产:

    class ProductWithTrack : Product {
        public Track Track { get; set; }
    }
    

    我的努力是将此类映射到Product表,与 Product 类相同,但如何计算Track属性的映射,我尝试过:< / p>

    • 一对多,但Track不是一个集合
    • 多对一/一对一,这需要Product表中的外键列肯定不存在

    请帮助解决此映射问题,谢谢。

1 个答案:

答案 0 :(得分:1)

一种方法是基于观察列表页面是数据的报告视图。特别是它结合了有关产品及其跟踪状态的信息。对于报表视图,您无需为所需数据创建显式映射,而是可以使用NHibernate的query capabilitiesprojections来获取所需的结果。换句话说,ProductWithTrack不需要是它自己的实体。

作为另一种方法,不是让ProductWithTrack从Product继承,而是应该有一个名为TrackedProduct的类:

class TrackedProduct {
 public int ID { get; private set; }
 public Product Product { get; private set; }
 public Track Track { get; private set; }
}

此类表示被跟踪产品的概念,并具有自己的标识。然后,您可以查询此实体以获取所需数据。