Я считаю, что вам нужен IList<Person> Contacts {get;set;}
и тип (дискриминатор), чтобы вы знали, к чему его привести. Может быть, это хак, но я бы так и сделал.
EDIT:
Допустим, ваши сущности будут выглядеть следующим образом.
public abstract class Person
{
public virtual int Id { get; private set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
public class Customer : Person
{
public virtual string Foo { get; set; }
}
public class Contact : Person
{
public virtual string Bar { get; set; }
}
Простой (хакерский) способ решения вашей проблемы - дискриминатор и перемещение всего на один стол. Сопоставление для этого может выглядеть следующим образом:
public class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Id(x => x.Id).GeneratedBy.Native();
Map(x => x.FirstName).Length(40);
Map(x => x.LastName).Length(100);
DiscriminateSubClassesOnColumn("TypeOfPerson");
}
}
public class CustomerMap : SubclassMap<Customer>
{
public CustomerMap()
{
Map(x => x.Foo);
}
}
public class ContactMap : SubclassMap<Contact>
{
public ContactMap()
{
Map(x => x.Bar);
}
}
Если вы сгенерируете свою схему на основе этой модели, вы получите:
create table [Person] (
Id INT IDENTITY NOT NULL,
BillingDetailsType NVARCHAR(255) not null,
FirstName NVARCHAR(40) null,
LastName NVARCHAR(100) null,
Foo NVARCHAR(255) null,
Bar NVARCHAR(255) null,
primary key ( Id ))
Я понимаю, что это, возможно, не идеально, так что если ваш начальник (как и мой) является гуру базы данных, который отказывается оставлять базу данных в таком состоянии. Все, что вам нужно сделать, это удалить DiscriminateSubClassesOnColumn("TypeOfPerson");
, и вместо этого вы должны получить структуру таблицы, как показано ниже, если вы сгенерируете схему из своего кода:
-- statement #1
create table [Person] (
Id INT IDENTITY NOT NULL,
FirstName NVARCHAR(40) null,
LastName NVARCHAR(100) null,
primary key ( Id ))
-- statement #2
create table [Customer] (
Person_id INT not null,
Foo NVARCHAR(255) null,
primary key ( Person_id ))
-- statement #3
create table [Contact] (
Person_id INT not null,
Bar NVARCHAR(255) null,
primary key ( Person_id ))
-- statement #4
alter table [Customer]
add constraint FKFE9A39C0B58BA2A5 foreign key ( Person_id ) references [Person]
С помощью этой последней схемы вам нужно найти способ определить, каким подклассом на самом деле является выбранный Человек, если вам когда-либо понадобится IList<Person>
, но я уверен, что вы можете это выяснить. :) Надеюсь, это поможет!