【问题标题】:NHibernate 1:n mapping to 1:1 with restrictionsNHibernate 1:n 映射到 1:1 有限制
【发布时间】:2011-10-21 18:17:37
【问题描述】:

我的申请是这样的:

  1. 我有一个类产品
  2. 我有用户跟踪这个产品,所以类 Track

注意多个用户可以跟踪一个产品,所以 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 属性的映射,我试过了:

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

请帮忙解决这个映射问题,谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 对不起,但我仍然很困惑......我已经尝试过谷歌“reporting view hibernate”但没有得到任何结果,如果我有一个带有自己 ID 的类 TrackedProduct,那么这个 ID 来自哪里从 ?非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2010-11-30
    相关资源
    最近更新 更多