Проблема Query / Mapping с использованием NHibernate - PullRequest
0 голосов
/ 15 апреля 2011

У меня возникла проблема с определенным запросом, который я пытаюсь выполнить для простой пары соединенных классов, представленной в моем примере ниже:

Классы:

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;}
}

Свободные отображения:

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 является правильным (или, возможно, просто слегка ошибочным).

EDIT: Базовые таблицы:

ParentClass: ParentClassId, ChildClassId
ChildClass: ChildClassId, ChildCode

Ответы [ 2 ]

0 голосов
/ 15 апреля 2011
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));
0 голосов
/ 15 апреля 2011

Я новичок nhibernate, но я думаю, что вы должны сначала присоединиться к таблице в запросе, используя CreateAlias, прежде чем сможете сделать запрос по одному из его свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...