У меня есть класс Address, который я хочу использовать для информации об адресах других объектов. Ниже я вставляю 2 примера классов Company и Person, которые используют класс Address
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 ответа
Вам нужны классы Company и Person для реализации общего интерфейса. Добавьте поле в адрес, которое будет отслеживать, принадлежит ли строка компании или человеку. Затем используйте тег <any>
в сопоставлении адресов. См. публикацию Ayende 'NHibernate Mapping -
Я не уверен, почему вам нужна двунаправленная ссылка от адреса к владельцу; это действительно нужно? Действительно ли адрес должен знать, кому он принадлежит?
Возможно, вы захотите отказаться от этого отношения и придумать общий «общий» класс отношения, например:
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>
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.