2011-08-07 70 views
0

我有我的应用程序li​​ek这样的:NHibernate的1:N映射到1:1的限制

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

注意多个用户可以跟踪一个产品,因此产品之间的关系:轨道为1:n

然而,如果用户正在登录,那只能是曲目相关产品,并在我的列表页面,我应该显示的产品列表与当前用户的跟踪状态,是这样的:

  • 产品A - 在纯SQL履带上2010-12-20
  • ...

因此 - 履带上2011-01-01

  • 产品B - 不履带
  • 产品C ,我可能有这样的查询:

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

    但使用NHibernate我发现它不容易实现,目前我有一个ProductWithTrack类,它产品类继承,并增加了一个轨道财产:

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

    我的工作是绘制该类产品表只是一样产品类,但我怎样才能算出轨道PR的映射operty,我曾尝试:

    • 一个一对多的,但轨道是不是一个集合
    • 多到1个/ 1到一个,这需要在产品表的外键列其中当然不存在

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

  • 回答

    1

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

    作为另一种方法,而不必从ProductWithTrack继承产品,你应该有一个类调用TrackedProduct:

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

    此类表示跟踪产品的概念,有其自己的身份。然后您可以查询该实体以获取所需的数据。

    +0

    对不起,但我仍然困惑...我曾试图谷歌“报告视图休眠”但没有结果,如果我有一个类TrackedProduct与自己的ID,那么这个ID从哪里来?非常感谢。 – otakustay