2011-08-07 31 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