2009-07-16 145 views
0

我有一個地址類,我想用於其他對象的地址信息。下面我粘貼2示例類公司和個人使用Address類類設計和NHibernate映射問題

public class Company 
{ 
    public virtual string Name { get; set; } 
    public virtual string Phone { get; set; } 
    public virtual string Fax { get; set; } 

    public virtual Address Address { get; set; } 
} 

public class Person 
{ 
    public virtual string Name { get; set; } 
    public virtual string Phone { get; set; } 
    public virtual string Fax { get; set; } 

    public virtual Address Address { get; set; } 
} 

public class Address 
{ 
    public virtual string Address1 { get; set; } 
    public virtual string CityName { get; set; } 
    public virtual string StateName { get; set; } 
    public virtual string CountryName { get; set; } 

    public virtual AddressOf AddressOf { get; set; } 
    public virtual object Owner { get; set; } 
} 

public enum AddressOf : byte 
{ 
     Company, 
    Person 
} 

我的計劃是有一個地址表,我會保持公司的客戶等的地址 每個地址都有其唯一的ID,並關聯到通過另一個owner_id和owner_type列的地址的所有者。

我通常的做法是在所有需要地址信息的表上填寫地址列(然後我可以爲nhibernate執行組件映射),但現在我想這可能不是必需的,我可以收集所有地址一張公共桌..

現在我的挑戰是我如何將這些映射到nhibernate。我認爲一個一對一的映射,但無法弄清楚如何我將映射應該從所有者/公司被foreignly產生owner_id柱,人等

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" > 
    <class name="Company" table="Companiess"> 
     <id name="ID" column="ID" type="Int32" unsaved-value="0"> 
      <generator class="native" /> 
     </id> 

     <property name="Name" /> 
     <property name="Phone" /> 
     <property name="Fax" /> 

     <one-to-one name="Address" class="Address" /> 

    </class> 
</hibernate-mapping> 

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Addresses" table="Addresses "> 
     <id name="ID" column="ID" type="Int32" unsaved-value="0"> 
      <generator class="native" /> 
     </id> 


     <property name="Address1" /> 
     <property name="CityName" /> 
     <property name="StateName" /> 
     <property name="CountryName" /> 

     <one-to-one "here is where im having trouble, I need to map owners id to owner_id column of Addresses table" ></one-to-one> 


    </class> 
</hibernate-mapping> 

如果你看到一個結構問題,亦請告知我知道,因爲我之前沒有使用過單獨的地址表,並且我對此還不完全適應。 謝謝!

回答

2

您需要Company和Person類來實現通用接口。在地址中添加一個字段,該字段用於追蹤該行是否屬於公司或人員。然後在地址映射中使用<any>標籤。關於這個問題見Ayende's post 'NHibernate Mapping - <any/>'

+0

此方法讓我考慮將地址字段保留在同一張表而不是單獨的表上,因爲它看起來像這樣會使事情變得複雜......(如果沒有更好的解決方案,我會將它標記爲答案) – kaivalya 2009-07-16 14:57:10

0

我不確定爲什麼你想要從地址到所有者的雙向鏈接;那真的有必要嗎?地址是否真的需要知道誰擁有?

你可能要考慮刪除這層關係,並提出了一個通用的「共享」關係類,像這樣:

public class Relation 
{ 
    public virtual string Name { get; set; } 
    public virtual string Phone { get; set; 
    public virtual string Fax { get; set; } 
    public virtual Address Address { get; set; } 
} 

和...

public class Person : Relation 
{ 
} 
public class Company : Relation 
{ 
} 

和映射文件:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" > 
    <class name="Relation" table="Relations"> 
     <id name="ID" column="ID" type="Int32" unsaved-value="0"> 
      <generator class="native" /> 
     </id> 

     <property name="Name" /> 
     <property name="Phone" /> 
     <property name="Fax" /> 
     <Component name="Address" class="Address" > 
     ... address fields... 
     </Component> 

     <joined subclass="Person..." /> 

     <joined subclass="Company..." /> 


    </class> 
</hibernate-mapping>