使用NHibernate查询/映射问题

时间:2011-04-15 15:20:45

标签: c# fluent-nhibernate

我遇到某个查询的问题我正在尝试对付一对简单的连接类,如下例所示:

类:

public class ParentClass
{
   public virtual Guid ParentClassId { get;set;}
   public virtual ChildClass ChildClassRef { get;set;}
}

public class ChildClass
{
    public virtual Guid ChildClassId { get;set;}
    public virtual string ChildCode { get;set;}
}

Fluent Mappings:

public class ParentClassMap : ClassMap<ParentClass>
{
    public ParentClassMap()
    {
        Id(x => x.ParentClassId).GeneratedBy.Guid();
        References<ChildClass>(x => x.ChildClassRef, "ChildClassId").ForeignKey("ChildClassId").Fetch.Join();
    }
}
public class ChildClassMap : ClassMap<ChildClass>
{
    public ChildClassMap()
    {
        Id(x => x.ChildClassId).GeneratedBy.Guid();
        Map(x => x.ChildCode).Not.Nullable();
    }
}

这失败了:

DetachedCriteria criteria = DetachedCriteria.For(boType);
criteria.Add(Expression.Eq("ChildClassRef.ChildCode", "ABC"));
ICriteria runnableCriteria = detachedCriteria.GetExecutableCriteria(session);
IList ilistResult = runnableCriteria.List();

有错误:“无法解析属性:ChildClassRef.ChildCode”。

但是,此标准有效:

criteria.Add(Expression.Eq("ChildClassRef.ChildClassId", "931DAF7A-15D1-4B0B-8030-1C113BABC554"));

这与其他证据一起向我建议我的Fluent Reference映射是正确的(或者可能只是略有缺陷)。

编辑: 基础表:

ParentClass: ParentClassId, ChildClassId
ChildClass: ChildClassId, ChildCode

2 个答案:

答案 0 :(得分:0)

我是一个nhibernate newb但我认为你首先必须使用CreateAlias在查询中加入表,然后才能查询其中一个属性。

答案 1 :(得分:0)

criteria.Add(Expression.Eq("ChildClassRef.ChildCode", "ABC")); 

不同
criteria.Add(Expression.Eq("ChildClassRef.ChildClassId", "931DAF7A-15D1-4B0B-8030-1C113BABC554"));

因为它引用了不同的属性(ChildCode!= ChildClassId)。另一方面,为了获得更好的结果,请使用CreateCriteria;

var criteria = DetachedCriteria.For<AccountingTransaction>();
criteria.Add(Restrictions.Eq("Period", period));
criteria.CreateCriteria("SimpleDocument", "d", NHibernate.SqlCommand.JoinType.InnerJoin);
criteria.Add(Restrictions.Like("d.DocumentCode", reference, MatchMode.Start));