2011-03-27 52 views
3

我正在將應用程序遷移到NHibernate,並且我正在使用Fluent NHibernate。我遇到了將一組值集合映射到聚合根目錄的問題。在流利NHibernate中處理與值類型的一對多關係

我有了一些屬性— NumberNumberTypeDescription一個PhoneNumber值類型。我的域中有許多對象具有電話號碼集合。

在數據庫(SQL 2008)中,這些值保存在不同的表中。所以我可能有CustomersCustomerPhoneNumbers以及VendorsVendorPhoneNumbers。電話號碼錶除了將它們與其父母相關的外鍵之外是相同的。

的問題是,我想用一個簡單的PhoneNumber值類型,而無需創建CustomerPhoneNumberVendorPhoneNumber類型有他們與他們的父類的屬性,我不知道如何實現,在NHibernate的。這是可能的還是我需要更改我的域對象以更緊密地匹配基礎數據庫模式?

更新:一些更多的信息
它看起來像我有,甚至獲得基本的地圖檢索工作的麻煩。下面是我的一個簡單示例:

public class CustomerMap : ClassMap<Customer> 
{ 
    public CustomerMap() 
    { 
     Table("Customers"); 

     Id(x => x.Id); 
     Map(x => x.Name); 
     Component(x => x.Address); 
     HasMany(x => x.PhoneNumbers) 
      .KeyColumn("CustomerId") 
      .Cascade.All() 
      .Table("CustomerPhoneNumbers"); 
    } 
} 

public class PhoneNumberMap : ClassMap<PhoneNumber> 
{ 
    public PhoneNumberMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Number, "PhoneNumber"); 
     Map(x => x.PhoneNumberType); 
     Map(x => x.Description); 
    } 
} 

它看起來像SQL沒有正確生成。當我試圖查看客戶的PhoneNumbers列表時,發現一個ADO錯誤,顯示NHibernate正在查找名爲PhoneNumber的表。

它看起來好像不是拾取Table("CustomerPhoneNumbers")部分,並且默認爲與對象命名相同的表。然而,我無法在PhoneNumberMap中指定一個表格,因爲它取決於我們正在拉取的聚合根目錄而有所不同。

+0

可能要在此線程閱讀http://goo.gl/D0RmN – used2could 2011-03-27 16:08:33

+0

這似乎是關於複合鍵,所以我不知道這適用於此。我目前最大的問題是,即使我在聚合根的map類中指定了一個表名,NHibernate使用的是值類型map類中的表名,或者,如果沒有,則假定表名是相同的作爲班級名稱。 – 2011-03-27 17:00:21

+0

它默認與表名具有相同名稱的原因是因爲您沒有在PhoneNumberMap類中指定Table(「TableName」)。這並不能解決你必須將多個表映射到同一個電話號碼對象的問題,但希望有一個解決方案。 – 2011-03-27 22:43:31

回答

0

您可以使用entity-name映射屬性將單個對象PhoneNumber映射到多個表。對不起,沒有示例代碼 - 我不使用Fluent,所以我無法幫助這方面。如果這會有幫助,我可以發佈樣本HBM映射。

實體名稱基本上全部替換類名稱。當您使用實體名稱時,您還必須修改會話才能接受參數,以便在通過會話處理對象時指定實體名稱。

文檔是在這裏:

http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname

編輯添加HBM樣本。

這映射單個對象******中國多個表

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
<class name="DomainModel.PhoneNumber, DomainModel" 
    table="PhoneNumberVendors" entity-name="PhoneNumberVendor"> 
    <id name="_id" access="field" column="PhoneNumberId"> 
     <generator class="assigned"/> 
    </id> 
    <property name= "..."> 
    </class> 
<class name="DomainModel.PhoneNumber, DomainModel" 
    table="PhoneNumberCustomers" entity-name="PhoneNumberCustomer"> 
    <id name="_id" access="field" column="PhoneNumberId"> 
     <generator class="assigned"/> 
    </id> 
    <property name= "..."> 
    </class> 
</hibernate-mapping> 

然後調用例如更新上一個PhoneNumber你修改會話語法如下這樣NHibernate的知道使用哪個表:

_session.Update("PhoneNumberCustomer", myCustomerNumber) 

您將不得不弄清楚Fluent是否支持這一點,如果是的話如何去做。如果不是的話,你總是可以使用hbm文件作爲PhoneNumber對象。

+0

它看起來像實體名稱更適合我的類,而不是DB,除非我誤解它。 – 2011-03-28 16:50:36

+0

不是「實體名稱」作爲一般概念。 NHibernate有一個非常特殊的屬性「entity-name」,用於指定NHibernate何時應該將一個對象(如PhoneNumber)映射到DB中的多個表。我在上面添加了示例HBM映射。 – Sisyphus 2011-03-28 20:14:03

+0

我的問題是表上的外鍵不一樣。我想我可以將它們全部更改爲'Parent_id',並讓NH使用該默認設置... – 2011-03-28 20:21:48

相關問題