Дизайн класса и вопрос картографирования NHibernate - PullRequest
0 голосов
/ 16 июля 2009

У меня есть класс Address, который я хочу использовать для информации об адресе других объектов. Ниже я привожу 2 примера классов Company и Person, которые используют Address class

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
}

Мой план - создать таблицу адресов, в которой я буду хранить адреса клиентов компаний и т. Д. Каждый адрес будет иметь свой уникальный идентификатор и будет связываться с владельцем адреса через другие столбцы 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 ]

2 голосов
/ 16 июля 2009

Вам нужны классы Company и Person для реализации общего интерфейса. Добавьте поле в Адрес, которое будет отслеживать, принадлежит ли строка Компании или Персоне. Затем используйте тег <any> в сопоставлении адресов. См. пост Айенде 'NHibernate Mapping - ' по теме.

0 голосов
/ 19 июля 2009

Я не уверен, почему вы хотите двунаправленную ссылку от адреса к владельцу; это действительно было бы необходимо? Действительно ли адрес должен знать, кому он принадлежит?

Возможно, вы захотите отбросить это отношение и придумать общий класс «общих» отношений, например:

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>
...