2009-05-06 181 views
0

NHibernate noob here。尋找諮詢如何映射以下常見的場景:NHibernate映射文件幫助

[存儲]
ID PK
名稱

[StockItem]
ID PK
名稱

[ StockItemStore]
id pk
StockItemId FK
STOREID FK
ParLevel

我已經創建了一個的DomainModel允許各種StockItems經由StockItem實體使用AssignToStore(存儲商店)方法被分配給各種商店。

我現在使用nhibernate來創建我的數據庫模式。如何爲這個基本場景設置映射文件?

任何提示非常感謝。

CHEV

回答

1

不幸的是,這種關係並不是在nHibernate中建模最簡單的事情,並且在嘗試對鏈接表中的數據執行查詢時會遇到一些固有問題,這需要一些複雜的解決方法,但是一旦得到它設置得很好。

我的方法是將其設置爲兩個多對一的映射,其中存儲映射中的以下關係和StockItem映射中的反向關係。

<bag name="StockItems" table="StockItemStore" lazy="true"> 
    <key column="StoreId" /> 
    <composite-element class="SuperStore.Components.StockItemStore, SuperStore.Components"> 
    <property name="ParLevel" type="Int32" /> 
    <many-to-one name="StockItem" column="StockItemId" class="SuperStore.Components.StockItem, SuperStore.Components" fetch="join" cascade="all" /> 
    </composite-element> 
</bag> 

的存儲類將具有以下集合:

public virtual IList< StockItemStore > StockItems {get;set;}

和StockItem將再次逆:

public virtual IList< StockItemStore > Stores {get;set;}

的StockItemStore對象可以包含任何對象(Store或StockItem)以及鏈接表中的任何其他信息。(在這種情況下只是ParLevel)

取決於您在StoreItem或StockItem中查看StockItemStore對象的哪一側將爲空,它可以分解爲兩個類,但我覺得這種方法更容易處理。它只是需要你作爲開發人員知道哪些方面你是從接近它,但它是一個很好的折衷爲使代碼更簡單,更可重複使用在我看來

public class StockItemStore 
{ 
    private StockItem stockItem; 
    private Store store; 

    public virtual StockItem StockItem 
    { 
     get 
     { 
      if (stockItem == null) 
      { 
       stockItem = new StockItem(); 
      } 

      return stockItem; 
     } 
     set 
     { 
      stockItem = value; 
     } 
    } 

    public virtual Store store 
    { 
     get 
     { 
      if (store == null) 
      { 
       store = new Store(); 
      } 

      return store; 
     } 
     set 
     { 
      store = value; 
     } 
    } 

    public virtual int ParLevel { get; set; } 

} 

我的方法不使用單一的唯一標識符在你的問題中定義的StockItemStore中,而是在鏈接表中相當於一個複合關鍵字,但它在過去總體上對我很好,我相信你可以在s o如果你真的需要它。

這種方法適用於使用HQL進行查詢。如果您正在嘗試使用ICriteria查詢,它往往會變得有點過分。有一些解決方案使用數據庫視圖模擬另一個表來用於查詢已爲我工作。

如果你需要做ICriteria查詢讓我知道,我可以張貼一些示例代碼。

  • 最大
+0

我忘了提,我刪除了它的StockItemStore類的代碼示例簡單,但你應該*總*實現equals和GetHashCode在NHibernate的對象 – 2009-05-06 19:37:09

1

我會強烈建議NHibernate的閱讀起來。這裏是一個非常好的起點:

The nHibernate FAQ

我也建議你做手工映射第幾次。之後,你應該看看Fluent nHibernate。流利的nHibernate可以(除其他外)自動爲您的域模型生成映射,並幫助您生成數據庫模式。這是一個非常靈活的工具,越來越好。你會在這裏找到它:

Fluent nHibernate

祝你好運!