Fluent NHibernate映射受保护的属性:无法解析属性:BookingNumber of:B
假设以下类别:Fluent NHibernate映射受保护的属性:无法解析属性:BookingNumber of:B,nhibernate,fluent-nhibernate,nhibernate-mapping,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Nhibernate Mapping,Fluent Nhibernate Mapping,假设以下类别: public class A { public virtual ind Id { get; set; } public virtual int Number { get; protected set; } } public class B : A { public virtual string SomeValue { get; set; } public virtual int BookingNumber { get { return Number
public class A
{
public virtual ind Id { get; set; }
public virtual int Number { get; protected set; }
}
public class B : A
{
public virtual string SomeValue { get; set; }
public virtual int BookingNumber
{
get { return Number; }
set { Number = value; }
}
}
public class C : A
{
public virtual string SomeOtherValue { get; set; }
public virtual int AccountNumber
{
get { return Number; }
set { Number = value; }
}
}
如您所见,我想以不同的名称公开属性号
现在我想画A,B,C
public class AMap : ClassMap<A>
{
public AMap()
{
Id(x => x.Id);
Map(x => x.Number);
}
}
public class BMap : SubclassMap<B>
{
public BMap()
{
Map(x => x.SomeValue);
}
}
public class CMap : SubclassMap<C>
{
public CMap()
{
Map(x => x.SomeOtherValue);
}
}
公共类AMap:ClassMap
{
公共AMap()
{
Id(x=>x.Id);
Map(x=>x.Number);
}
}
公共类BMap:子类映射
{
公共BMap()
{
Map(x=>x.SomeValue);
}
}
公共类CMap:子类映射
{
公共CMap()
{
Map(x=>x.SomeOtherValue);
}
}
通过这种映射,我可以将内容保存到数据库中
但是,当我查询B或C时:
Session.QueryOver<B>().Where(x => x.BookingNumber).List();
Session.QueryOver().Where(x=>x.BookingNumber.List();
我收到错误无法解析属性:BookingNumber of:B
我做错了什么?怎么了?在未映射的属性上生成查询 (用不同的名称包装驱动类中的基属性至少很奇怪), 如果确实需要这种方法,因为某些上层需要不同的 相同属性的名称。。。那好吧。但是,NHibernate必须是 提供了不同的信息集 将您的查询视为自描述性信息,其中包含足以转换为SQL语句的信息 因此,如果您使用
QueryOver.Where(x=>x.BookingNumber==1)…
。信息是(在解析lambda表达式时):
B
BookingNumber
BookingNumberColumn
1
和BookingNumber
解决方案是,至少在数据(NHibernate)层上,基于基类a
映射应用过滤器
Session
.QueryOver<B>()
.Where(x => x.Number == 1) // use the A.Number MAPPED property
.List<B>();
会话
.QueryOver()
.Where(x=>x.Number==1)//使用A.Number映射属性
.List();
但是,根据我的经验,我们主要做的是转换持久性的差异(不同的id列名、不同的代码列),并将它们映射到具有公共简化结构的C#基类或接口
更多信息:这种设计听起来很可怕。。。你为什么要这样做?