简体   繁体   English

使用NHibernate的查询/映射问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM