类设计和NHibernate映射问题

时间:2009-07-16 02:16:58

标签: c# nhibernate nhibernate-mapping

我有一个我想用于其他对象地址信息的Address类。下面我粘贴2个使用Address类

的示例类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>

如果你看到一个架构问题,请告诉我,因为我之前没有使用过单独的地址表,而且我还不是很满意。 谢谢!

2 个答案:

答案 0 :(得分:2)

您需要Company和Person类来实现通用接口。在地址中添加一个字段,该字段将跟踪该行是属于公司还是人员。然后在地址映射中使用<any>标记。有关该主题,请参阅Ayende's post 'NHibernate Mapping - <any/>'

答案 1 :(得分: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>