每个类层次结构都需要使用Fluent NHibernate表。其中()?

每个类层次结构都需要使用Fluent NHibernate表。其中()?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有一组基于抽象contact类实现的contact类的以下映射 public class ContactMapping : ClassMap<Contact> { public ContactMapping() { Id(x => x.Id).GeneratedBy.GuidComb(); Map(x => x.CreatedDate).Not.Nullable(); Map(

我有一组基于抽象contact类实现的contact类的以下映射

   public class ContactMapping : ClassMap<Contact> {
        public ContactMapping() {
            Id(x => x.Id).GeneratedBy.GuidComb();
            Map(x => x.CreatedDate).Not.Nullable();
            Map(x => x.Value).Not.Nullable();
            Map(x => x.Level).Not.Nullable();
            Map(x => x.Comments);
            DiscriminateSubClassesOnColumn("ContactType");
        }
    }

    public class PhoneContactMapping : SubclassMap<PhoneContact> {
        public PhoneContactMapping() {
            Map(p => p.PhoneType);
            DiscriminatorValue("PhoneContact");
        }
    }
    public class EmailContactMapping : SubclassMap<EmailContact> {
        public EmailContactMapping() {
            DiscriminatorValue("EmailContact");
        }

    }
    public class WebsiteContactMapping : SubclassMap<WebsiteContact> {
        public WebsiteContactMapping() {
            DiscriminatorValue("WebsiteContact");
        }
    }
公共类联系人映射:类映射{
公共联系人映射(){
Id(x=>x.Id).GeneratedBy.GuidComb();
Map(x=>x.CreatedDate).Not.Nullable();
Map(x=>x.Value).Not.Nullable();
Map(x=>x.Level).Not.Nullable();
地图(x=>x.Comments);
区分子类子列(“接触类型”);
}
}
公共类PhoneContactMapping:子类映射{
公共电话联系人映射(){
Map(p=>p.PhoneType);
鉴别器值(“电话联系人”);
}
}
公共类EmailContactMapping:子类映射{
公共电子邮件联系人映射(){
鉴别器值(“电子邮件联系人”);
}
}
公共类WebsiteContactMapping:子类映射{
公共网站ContactMapping(){
鉴别器值(“网站联系人”);
}
}
我有一个实体类,它有许多EmailContact、WebsiteContact和PhoneContact

公共类ContactableEntityMapping:ClassMap{
公共联系人实体映射(){
Id(x=>x.Id).GeneratedBy.GuidComb();
Map(x=>x.CreatedDate).Not.Nullable();
Map(x=>x.Comment);
有许多(x=>x.EmailContacts).AsBag().Not.LazyLoad().Where(“ContactType='EmailContact');
HasMany(x=>x.PhoneContacts).AsBag().Not.LazyLoad().Where(“ContactType='PhoneContact');
HasMany(x=>x.WebsiteContacts)。Not.LazyLoad().AsBag()。其中(“ContactType='WebsiteContact');
HasManyToMany(x=>x.Addresses).AsSet();
}
}
如果我没有在那里指定.Where()子句,那么如果使用LazyLoading,则该类将返回所有映射到EmailContact的行(因为它是列表中的第一个),如果不使用lazy loading,则会收到一个异常,因为它试图将类转换为错误的类型

显然,这是因为执行的SQL不会传入额外的where子句,除非我在映射中指定它。我是在地图上遗漏了什么,还是哪里的混乱只是我们需要面对的


谢谢你的帮助

我假设PhoneContact继承了Contact,对吗?奇怪的是,我现在正在与完全相同的问题作斗争,你解决过吗?我假设PhoneContact继承了Contact,对吗?奇怪的是,我现在正在与完全相同的问题作斗争,你解决过吗?
public class ContactableEntityMapping: ClassMap<ContactableEntity> {
    public ContactableEntityMapping() {
        Id(x => x.Id).GeneratedBy.GuidComb();
        Map(x => x.CreatedDate).Not.Nullable();
        Map(x => x.Comment);
        HasMany<EmailContact>(x => x.EmailContacts).AsBag().Not.LazyLoad().Where("ContactType='EmailContact'");
        HasMany<PhoneContact>(x => x.PhoneContacts).AsBag().Not.LazyLoad().Where("ContactType='PhoneContact'");
        HasMany<WebsiteContact>(x => x.WebsiteContacts).Not.LazyLoad().AsBag().Where("ContactType='WebsiteContact'");
        HasManyToMany(x => x.Addresses).AsSet();
    }
}