簡體   English   中英

類設計和NHibernate映射問題

[英]Class design and NHibernate mapping question

我有一個Address類,我想將其用於其他對象的地址信息。 下面我粘貼使用Address類的2個示例類Company和Person

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。 我想到了一對一的映射,但無法確定如何映射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>

如果您遇到體系結構問題,也請讓我知道,因為我以前沒有以這種方式使用過單獨的地址表,而且我對此還不太滿意。 謝謝!

您需要Company和Person類來實現公共接口。 在地址中添加一個字段,該字段將跟蹤該行是公司還是個人。 然后在地址映射中使用<any>標記。 有關該主題,請參見Ayende的文章“ NHibernate映射-<any />”

我不確定為什么要從地址到所有者的雙向鏈接; 真的有必要嗎? 地址真的必須知道誰歸誰所有嗎?

您可能要考慮刪除該關系,並提出一個通用的“共享”關系類,如下所示:

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM