Отображение nHibernate для объекта на несколько разных родительских объектов (например, Адреса -> Фирма, Адреса -> Клиент) - PullRequest
4 голосов
/ 03 мая 2010

Может кто-нибудь помочь мне с наилучшим способом отобразить следующую ситуацию в беглом nHibernate?Класс Address используется как в Client, так и в Company.Как я могу сохранить его наиболее эффективным в SQL?И как должно выглядеть отображение?Я думал о нескольких вариантах, но у меня недостаточно опыта работы с nHibernate для следующих ситуаций:

  1. использовать 1 объект адреса и 1 таблицу и использовать столбец знаменателя, чтобы различать адрес дляклиент и адрес для компании -> как это реализовать в nHibernate?

  2. использовать 1 объект адреса и 2 таблицы (ClientAddresses и CompanyAddresses) -> но я могу определить только 1 таблицу вотображение класса Address

  3. использует 2 адресных объекта и 2 таблицы -> не очень элегантно

Я только что наткнулся на эту проблемукогда я начал внедрять корпоративный класс и понял, что ему также нужно несколько адресов.До сих пор у меня был класс Address и Client, и между ними было сопоставление «один ко многим».В базе данных адрес имел дополнительный столбец с именем ClientId.Но с введением класса Company я застрял ...

Любая помощь будет принята с благодарностью.

В настоящее время я работаю в среде sharparch 1.5, которая использует автоматическое сопоставление и файлы сопоставленияпохожи на это:

public class AddressMap : IAutoMappingOverride<Address>
{
    public void Override(AutoMapping<Address> mapping)
    {
        mapping.Table("addresses");
        mapping.Id(x => x.Id, "AddressGuid")
             .UnsavedValue(Guid.Empty)
             .GeneratedBy.GuidComb();

        mapping.References(x => x.Client, "ClientGuid");

    }
}

Ниже приведен еще один код, иллюстрирующий проблему:

Адрес

public class Address
{
   public virtual string StreetLine1 { get; set; }
   public virtual string StreetLine2 { get; set; }
   public virtual string PostalCode { get; set; }
   public virtual string City { get; set; }
   public virtual string Country { get; set; }
}

, который имеет следующую таблицу:

tablename = address
fields = AddressGuid, StreetLine1, StreetLine2, PostalCode, City, Country

Клиент

public class Client
{
    public IList<Address> Addresses {get;set;}
}

Компания

public class Company
{
    public IList<Address> Addresses {get;set;}
}

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Похоже, вы можете реализовать # 1 с отображением <any> в nHibernate. Обратите внимание, что в этом случае вы не можете указать ограничения внешнего ключа.

пример <any>

Свободный синтаксис nHibernate

0 голосов
/ 19 октября 2010

Вы можете смоделировать отношения как многие ко многим: множество компаний по многим адресам и множество клиентов по многим адресам.

В сопоставлениях как вашей компании, так и клиента:

mapping.HasManyToMany(x => x.Addresses);

Это создаст две дополнительные таблицы: одну для сопоставления компаний и адресов, другую для сопоставления клиентов и адресов.

Теоретически это может позволить совместное использование ситуаций (некоторые компании и все клиенты имеют одинаковую строку адреса), которые вы, вероятно, не хотите, но до тех пор, пока логика вашего приложения не допускает этого, хорошо, и с nhibernate вам ничего не придётся делать.

...