【问题标题】:QueryOver by alias with NHibernate is using property name not column mapping使用 NHibernate 的别名 QueryOver 使用的是属性名称而不是列映射
【发布时间】:2013-11-21 20:21:05
【问题描述】:

我在使用属性名称与列名称不匹配的对象指定 QueryOver order by 子句时遇到问题。

这是对象:-

public class ObjectInstance
{ 
    public ObjectInstance()
    {
        IsActive = true;
    }

    public virtual bool IsActive { get; set; }
}    

还有hibernate fluent映射:-

public class ObjectInstanceMap : ClassMap<ObjectInstance>
{
    public ObjectInstanceMap()
    {
        Table("ObjectInstances");
        Id(obj => obj.ObjectInstanceId).GeneratedBy.GuidComb();
        Map(x => x.IsActive, "ObjectInstanceIsActive");
    }
}

如您所见,数据库中的列名为 ObjectInstanceIsActive,但被映射到 ObjectInstance 对象的 IsActive 属性。尝试使用 QueryOver 获取 IList,如下所示:-

IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance)
    .UnderlyingCriteria.AddOrder(new Order("ObjectInstanceIsActive", true))
    .List<ObjectInstance>();

抛出一个错误,指出 ObjectInstance 对象没有 ObjectInstanceIsActive 属性,这是正确的,它没有。

如果我将条件更改为:-

IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance)
    .UnderlyingCriteria.AddOrder(new Order("IsActive", true))
    .List<ObjectInstance>();

然后 Hibernate 成功生成了一个 SQL 查询,但是它正在寻找一个名为 IsActive 的列,该列不存在并且出现错误。

我也尝试(单独)添加以下预测,但这没有帮助。

.Select(Projections.ProjectionList().Add(Projections.Property("IsActive"), "ObjectInstanceIsActive"))
.Select(Projections.ProjectionList().Add(Projections.Property("IsActive"),   "ObjectInstanceIsActive"))

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:
    IList<ObjectInstance> result = this.Session.QueryOver<ObjectInstance>(() => objectInstance)
      .UnderlyingCriteria.AddOrder(new Order("IsActive", true))
      .List<ObjectInstance>();
    

    对我来说实际上很好,按预期创建以下语句:

    SELECT this_.ObjectInstanceId as ObjectIn1_19_0_, this_.ObjectInstanceIsActive as 
    ObjectIn2_19_0_ FROM ObjectInstances this_ 
    ORDER BY this_.ObjectInstanceIsActive asc
    

    【讨论】:

      【解决方案2】:

      流畅的映射和查询本身看起来不错。再次检查使用new Order("IsActive", true)时生成的SQL是什么...这是可疑的。

      顺便说一句,更流畅(和类型安全)的语法是:

      var result = Session
          .QueryOver<ObjectInstance>(() => objectInstance)
          .OrderBy(() => objectInstance.IsActive)
            .Asc
          .List<ObjectInstance>();
      

      【讨论】:

        【解决方案3】:

        看起来我过度简化了我的示例。 ObjectInstance 是一个基类,作为一个独立的类,一切都如 MichaC 和 Radim 所指出的那样完美运行。在我的特定场景中,我有一个从它继承的子类,它正在将 IsActive 列重新映射到另一个未被注意到的别名下。

        干杯,伙计们。

        【讨论】:

          猜你喜欢
          • 2016-10-07
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-10
          • 1970-01-01
          • 1970-01-01
          • 2016-03-17
          相关资源
          最近更新 更多