[英]Query/Mapping problem using NHibernate
I'm experiencing a problem with a certain query I'm attempting against a simple joined pair of classes, represented in my example below: 我在尝试针对一对简单的联接的类对进行查询时遇到问题,如以下示例所示:
Classes: 类:
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();
}
}
This fails: 这将失败:
DetachedCriteria criteria = DetachedCriteria.For(boType);
criteria.Add(Expression.Eq("ChildClassRef.ChildCode", "ABC"));
ICriteria runnableCriteria = detachedCriteria.GetExecutableCriteria(session);
IList ilistResult = runnableCriteria.List();
with error: "could not resolve property: ChildClassRef.ChildCode". 错误:“无法解析属性:ChildClassRef.ChildCode”。
However, this criteria works: 但是,此条件有效:
criteria.Add(Expression.Eq("ChildClassRef.ChildClassId", "931DAF7A-15D1-4B0B-8030-1C113BABC554"));
This, along with other evidence, suggests to me that my Fluent Reference mapping is correct (or maybe just slightly flawed). 这和其他证据一起向我暗示,我的Fluent Reference映射是正确的(或可能只是有缺陷的)。
EDIT: Underlying tables: 编辑:基础表:
ParentClass: ParentClassId, ChildClassId
ChildClass: ChildClassId, ChildCode
我是nhibernate newb,但我认为您必须先使用CreateAlias将表加入查询中,然后才能对其属性之一进行查询。
criteria.Add(Expression.Eq("ChildClassRef.ChildCode", "ABC"));
is different to 与...不同
criteria.Add(Expression.Eq("ChildClassRef.ChildClassId", "931DAF7A-15D1-4B0B-8030-1C113BABC554"));
cause it references a different property (ChildCode != ChildClassId). 因为它引用了另一个属性(ChildCode!= ChildClassId)。 On the other hand for better results use CreateCriteria;
另一方面,使用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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.