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表达式时):

  • 使用C#object
    B
  • 查找其属性
    BookingNumber
  • 查找其映射表示形式:列名
    BookingNumberColumn
  • 取值:
    1
  • 生成了一个查询,其中BookingNumberColumn=1
  • 在这种情况下,步骤3失败。没有列映射到
    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#基类或接口


    更多信息:

    这种设计听起来很可怕。。。你为什么要这样做?