我相信你需要一个
IList<Person> Contacts {get;set;}
以及一个类型(鉴别器),以便您知道将其强制转换为什么。也许是黑客,但我就是这么做的。
编辑:
假设您的实体如下所示。
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>
但我相信你能理解。:)希望这有帮助!