Справка по запросу критериев NHibernate - PullRequest
0 голосов
/ 26 января 2010

Учитывая следующие таблицы, я пытаюсь вернуть все Распределения для данного Ресурса, которые попадают между заданным диапазоном дат, используя запрос критерия:

create table Resources (
    ResourceId  integer,
   ResourceName TEXT not null,
   BusinessId TEXT not null,
   OrganizationName TEXT not null,
   primary key (ResourceId)
)

create table Allocations (
    AllocationId  integer,
   StartTime DATETIME not null,
   EndTime DATETIME not null,
   PostingTime DATETIME,
   ResourceId INTEGER,
   ActivityBaseId INTEGER,
   primary key (AllocationId),
  unique (StartTime, EndTime, ResourceId, ActivityBaseId)
)

public Resource FetchFor(Resource resource, DateRange range) {
    var allocations = _session.CreateCriteria<Resource>()
            .CreateCriteria("Allocations")
                .Add(Restrictions.Between("EndTime", (DateTime)range.Start, (DateTime)range.End))
            .List<Allocation>();

        if (allocations.Count() > 0) 
            resource.ReplaceAllocations(allocations);

        return resource;
    }

Я получаю это исключение при запуске:

failed: NHibernate.QueryException : could not resolve property: EndTime of: Domain.Model.Allocations.Allocation

Модель сопоставлена, и я могу без проблем сохранить ресурс и связанные с ним распределения, как я делаю, чтобы протестировать этот запрос Fetch. Пример строки NHib sql: NHibernate: INSERT INTO Allocations (StartTime, EndTime, PostingTime, ResourceId, ActivityBaseId) ЗНАЧЕНИЯ (@ p0, @ p1, @ p2, @ p3, @ p4); выберите last_insert_rowid (); @ p0 = 28.01.2010 12:00:00, @ p1 = 28.01.2010 1:00:00, @ p2 = NULL, @ p3 = 1, @ p4 = 4

Сообщение об исключении сбивает с толку, поскольку NHib четко понимает, как сопоставить Allocation.EndTime. Пожалуйста:
1) помогите отстрелить / очистить запрос в этом посте и
2) указать любые любимые ресурсы для изучения запросов nhib, особенно если там есть примеры.

Кроме того, я понимаю, что я не использую параметр Resource в показанном примере, так как я в значительной степени (не так?) Применил код из примера на публикации Айенде . Если мне удастся заставить этот запрос на соединение работать, я превращу его в подзапрос по производительности.

Спасибо!
Berryl

=== NHib Mapping =====

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property"   auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" name="Domain.Model.Allocations.Allocation, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Allocations">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
  <column name="AllocationId" />
  <generator class="identity" />
</id>
<property name="TimeRange" type="Data.UserTypes.AllocationTimeRangeUserType, Data, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
  <column name="StartTime" not-null="true" unique-key="DomainSignature" />
  <column name="EndTime" not-null="true" unique-key="DomainSignature" />
</property>
<property name="PostingTime" type="System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="PostingTime" not-null="false" />
</property>
<many-to-one class="Domain.Model.Resources.Resource, Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="Resource_FK" name="Resource">
  <column name="ResourceId" unique-key="DomainSignature" />
</many-to-one>
<many-to-one class="Domain.Model.Activities.ActivityBase, Smack.ConstructionAdmin.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" foreign-key="ActivityBase_FK" name="Activity">
  <column name="ActivityBaseId" unique-key="DomainSignature" />
</many-to-one>

Ответы [ 2 ]

1 голос
/ 27 января 2010

Кажется, что у вас нет сопоставленного свойства Allocation с именем EndTime, поэтому неудивительно, что вы получаете эту ошибку. Столбец EndTime отображается через пользовательский тип TimeRange, так что вы можете ожидать запрос по этому вопросу.

Образец Allocation.cs и клиент TimeRange, вероятно, также помогут понять проблему.

1 голос
/ 27 января 2010

Я пытался продублировать вашу проблему, но безуспешно. Поскольку вы не используете ресурс в своем запросе, не могли бы вы попытаться упростить такие вещи, как:

var allocations = _session.CreateCriteria<Allocation>()  
            .Add(Restrictions.Between("EndTime", (DateTime)range.Start, (DateTime)range.End))
        .List<Allocation>(); 

Я выполнил несколько запросов на присоединение, могу привести следующий пример, надеюсь, это поможет:

        public IList<ItemOrder> GetItemOrderByCriteria(int? itemNumber, int? warehouseNumber, DateTime? orderPickDate, string orderStoreNum, string statusCode)
    {
        try
        {
            NHibernate.ICriteria criteria = NHibernateSession.CreateCriteria(typeof(Core.SuggestedOrders.ItemOrder));

            if (itemNumber.HasValue)
                criteria.CreateCriteria("Item", "Item").Add(Expression.Eq("Item.ItemNumber", itemNumber.Value));

            if (warehouseNumber.HasValue)
                criteria.CreateCriteria("Warehouse", "Warehouse").Add(Expression.Eq("Warehouse.WarehouseNumber", warehouseNumber));

            if (!String.IsNullOrEmpty(orderStoreNum))
                criteria.Add(Expression.Eq("OrdStoreNum", orderStoreNum));

            if (!String.IsNullOrEmpty(statusCode))
                criteria.Add(Expression.Eq("StatusCode", statusCode));

            if (orderPickDate.HasValue)
            {
                DateTime minPickDate = new DateTime(orderPickDate.Value.Year, orderPickDate.Value.Month, orderPickDate.Value.Day, 0,0,0);
                DateTime maxPickDate = new DateTime(orderPickDate.Value.Year, orderPickDate.Value.Month, orderPickDate.Value.Day, 23,59,59);

                criteria.Add(Expression.Between("OrdPickDate", minPickDate, maxPickDate));
            }

            return criteria.List<Core.SuggestedOrders.ItemOrder>();
        }
        catch (NHibernate.HibernateException he)
        {
            DataAccessException dae = new DataAccessException("NHibernate Exception", he);
            throw dae;
        }

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