Сопоставления таблицы соединений NHibernate - PullRequest
1 голос
/ 16 июля 2009

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

В основном (я уверен, что это было здесь в той или иной форме, но я не могу найти его) У меня есть 3 таблицы. Персональная таблица, Адресная таблица, PersonAddress ..

лицо

PersonID название Возраст и т.д ..

Адрес

AddressID
AddressLine1
AddressLine2
Город
Государство
Zip

PersonAddress

AddressID
PersonID
AddressType

Причина, по которой AddressType находится в таблице соединений, заключается просто в том, что эти адреса могут быть общими для всех сотрудников компании, таких как тип доставки, физическое местоположение или биллинг.

Есть ли еще возможность присоединиться к ним как к коллекции или как-то еще

Я бы хотел что-то вроде этого

Адрес класса

addressLine1
AddressLine2
Город
Государство
Zip
AddressType

Персональный класс

Имя
Возраст
IListAddresses

Этот человек будет хранить набор адресов для себя.

Если у кого-то есть способ, которым я мог бы сделать это в Fluent или просто в прямом XML-отображении, это было бы потрясающе. Я просто чувствую, что это должно быть легко, но мне не хватает этого. И, не имея правильной терминологии (таблица моста, таблица соединения, таблица сбора, таблица соединения), я не могу сказать, что Google спасает мне жизнь.

Заранее спасибо за любую помощь!

Ответы [ 3 ]

1 голос
/ 16 июля 2009

Я бы переместил AddressType из таблицы PersonAddress и поместил бы его в таблицу адресов. Тогда вы сможете отобразить обычное отображение «многие ко многим».

public class PersonMap : ClassMap<Person>  
{  
public PersonMap()  
  {  
    Id(x => x.PersonId);  
    Map(x => x.Name);  
    HasManyToMany(x => x.Addresses)  
     .Cascade.All()  
     .WithTableName("PersonAddress");  
  }  
}  
1 голос
/ 16 июля 2009

Я думаю, что это может быть достигнуто довольно легко, если я правильно понимаю. :) У вас есть объект Person, и вы хотите, чтобы он содержал некоторые свойства и коллекцию адресов человека, которые также могут использоваться другими пользователями, верно? Ну, чтобы настроить это с помощью Fluent NHibernate, я бы сделал что-то вроде этого:

// Person Entity
public class Person
{
    public int Id { get; private set; }
    public string Name { get; set; }
    public IList<PersonAddress> Addresses { get; set; }
}

// Fluent Mapping
public class PersonMap : ClassMap<Person>
{
    public PersonMap() {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Addresses).Cascade.All();
    }
}

// Address Entity
public class Address
{
    public int Id { get; private set; }
    public string Address1 { get; set; }
    public string City { get; set; }
    public IList<PersonAddress> People { get; set; }
}

// Fluent Mapping
public class AddressMap : ClassMap<Address>
{
    public AddressMap() {
        Id(x => x.Id);
        Map(x => x.Address1);
        Map(x => x.City);
        HasMany(x => x.People).Cascade.All();
    }
}

// PersonAddress Entity
public class PersonAddress
{
    public int Id { get; private set; }
    public Person Person { get; set; }
    public Address Address { get; set; }
    public AddressType Type { get; set; }
}

// Fluent Mapping
public class PersonAddressMap : ClassMap<PersonAddress>
{
    public PersonAddressMap() {
        Id(x => x.Id);
        References(x => x.Person);
        References(x => x.Address);
        Map(x => x.Type).CustomTypeIs(typeof(AddressType));
    }
}

По сути, это позволяет лицу иметь коллекцию адресов, и эти адреса могут совместно использоваться компанией (несколько человек). У вас почти есть настройка «многие ко многим», но из-за того, что вы хранили информацию о состоянии в PersonAddress, в сущности «Персона» и «Адрес» стали два отношения «один ко многим».

Извините, если я дал вам больше, чем вы хотели! Просто хотелось набрать текст! : Р

Дайте мне знать, если это поможет, или у вас есть какие-либо вопросы, или я совершенно не в курсе.

0 голосов
/ 18 ноября 2010

Можете ли вы настроить представление базы данных, которое объединяет таблицы Person и PersonAddress. Затем может быть создан объект адреса nHibernate, который содержит AddressType, даже если под ним есть желаемая структура таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...