FluentNHibernate: сопоставление вложенных компонентов приводит к NHiberate QueryException - PullRequest
4 голосов
/ 21 июля 2011

Привет, у меня проблема с отображением в Nhibernate. Когда я запускаю запрос linq, ссылающийся на один из классов компонентов моей сущности, я получаю исключение QueryException, как показано ниже:

не удалось разрешить свойство: ClosedCases of: Project.Entities.Headline

У меня есть одна таблица с записями, которую я хочу отобразить в несколько объектов моего заголовка.

Вопрос:

Что-то неправильно настроено в моем отображении?

Моя Headline сущность разделена на несколько логических классов, как показано ниже

  public class Headline:Entity
  {
    public virtual DateTime Date { get; set; }
    public virtual TeamTarget Teamtarget { get; set; }
  } 

 public class TeamTarget : Entity
  {
    public virtual DateTime FromDate { get; set; }
    public virtual DateTime ToDate { get; set; }
    public virtual TargetItem AchievedTarget { get; set; }
    public virtual Team Team { get; set; }
    }  

public class TargetItem : Entity
  {
    public virtual decimal ClosedCases { get; set; }
    public virtual decimal Invoicing { get; set; }
  }

Файл сопоставления:

  public class HeadlineMap: ClassMap<Headline>
  {
    public HeadlineMap()
    {
      Table("Headlines.Headlines");
      Id(x => x.Id).Column("HeadlinesId");
      Map(x => x.Date);
      Component(x => x.Teamtarget, t =>
      {
        t.References(x => x.Team).Column("TeamId").Cascade.None();
        t.Component(x => x.AchievedTarget, ti =>
        {
          ti.Map(x => x.Invoicing).Column("TeamInvoicing");
          ti.Map(x => x.ClosedCases).Column("TeamClosedCases");
        });
      });

Запрос Linq, который я выполняю, выглядит следующим образом:

decimal closedCases = _headlineRepository.All
.Where(x =>
x.Date >= DateTimeExtensionMethods.FirstDayOfMonthFromDateTime(selectMonthFromDate)
&& x.Date <= DateTimeExtensionMethods.LastDayOfMonthFromDateTime(selectMonthFromDate)
&& x.Teamtarget.Team.Id == teamId
).Average(x => x.Teamtarget.AchievedTarget.ClosedCases);

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

1 Ответ

4 голосов
/ 23 августа 2011

Я думаю, что ваше отображение в порядке.Но, насколько мне известно, невозможно запросить вложенный компонент с помощью Linq в NHibernate.Он не может понять, что нужно сделать для объединения, он становится слишком сложным.

Я думаю, что это возможно, используя API QueryOver в NHibernate 3, используя JoinQueryOver или JoinAlias.Вы должны прочитать это: QueryOver в NH 3.0

Может быть, что-то вроде этого будет работать:

Headline headlineAlias = null;
TeamTarget targetAlias = null;
Team teamAlias = null;
TargetItem targetItemAlias = null;

var query = session.QueryOver<Headline>(() => headlineAlias)
                   .JoinAlias(() => headlineAlias.Teamtarget, () => targetAlias)
                   .JoinAlias(() => targetAlias.Team, () => teamAlias)
                   .JoinAlias(() => targetAlias.AchievedTarget, () => targetItemAlias)
                   .Where(x => x.Date >= DateTimeExtensionMethods.FirstDayOfMonthFromDateTime(selectMonthFromDate) && x.Date <= DateTimeExtensionMethods.LastDayOfMonthFromDateTime(selectMonthFromDate))
                   .And(() => teamAlias.Id == teamId)
                   .Select(Projections.Avg(() => targetItemAlias.ClosedCases))
                   .SingleOrDefault<decimal>();
...