使用NHibernate的别名QueryOver使用属性名称而不是列映射

时间:2013-11-21 20:21:05

标签: c# nhibernate fluent-nhibernate

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

这是对象: -

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

    public virtual bool IsActive { get; set; }
}    

和hibernate流畅的映射: -

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"))

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

看起来我过度简化了我的例子。 ObjectInstance是一个基类,作为一个独立的东西,一切都像MichaC和Radim指出的那样完美。在我的特定场景中,我有一个继承自它的子类,它将IsActive列重新映射到一个不被注意的不同别名下。

干杯队员。