Как создать связь с использованием Fluent NHibernate - PullRequest
1 голос
/ 05 октября 2011

Как можно сопоставить отношения «один ко многим» с пользователем по адресу, клиентом по адресу, агентством по адресу и сохранить в одной таблице адресов, используя Fluent NHibernate

public class User
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Address> Address { get; set; }
}
public class Customer
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Address> Address { get; set; }
}
public class Agency
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual IList<Address> Address { get; set; }
}
public class Address
{
    public virtual int Id { get; set; }
    public virtual string Address1 { get; set; }
    public virtual string Address2 { get; set; }
    public virtual string City { get; set; }
    public virtual string State { get; set; }
}

Ответы [ 3 ]

1 голос
/ 05 октября 2011

В конструкторе для вашего класса отображения сопоставьте ссылку, используя метод HasMany.HasMany создаст отношение один-ко-многим .HasManyToMany создаст отношение «многие ко многим» .

Например: HasMany(x => x.Address).LazyLoad();

Это создаст одно-к-одному-множество отношений между классом User и классом Address.

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

Например: HasManyToMany(x => x.Address).Table("AddressToUser").ParentKeyColumn("AddressId").ChildKeyColumn("UserId").LazyLoad();

Если вы решили установить различие между UserAddress и AgencyAddress (гдеэто подклассы Address) - вы можете использовать метод DiscriminateSubClassesOnColumn в классе AddressMap, чтобы FNH знал, как создать дополнительный столбец для определения типа создаваемого объекта.

Например: DiscriminateSubClassesOnColumn("Type").AlwaysSelectWithValue();

1 голос
/ 06 октября 2011

Вы должны иметь возможность использовать FNH Automapping для сопоставления этих классов "как есть".

Он будет обрабатывать все отношения в вашей объектной модели.

Я полагаю, что все адреса будут помещены в одну таблицу адресов по вашему желанию, но точно сказать не могу.

1 голос
/ 05 октября 2011

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

Вы можете сопоставить коллекции как многие-ко-многим и использовать метод table, чтобы назвать таблицу ссылок.Ваше отображение будет выглядеть примерно так:

public UserMap : ClassMap<User> {
  Id (u => u.Id);
  Map (u => u.Name);
  HasManyToMany (u => u.Addresses).Table ("UsersXAddresses");
}

Вам понадобится аналогичная таблица ссылок для клиентов и агентств.

...