每个类层次结构都需要使用Fluent NHibernate表。其中()?
我有一组基于抽象contact类实现的contact类的以下映射每个类层次结构都需要使用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(
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();
}
}