Несоответствие типов критериев NHibernate - PullRequest
1 голос
/ 01 апреля 2009

Этот код

ICriteria crit = service.Session.CreateCriteria(typeof (DatabaseVersion));
crit.Add(Restrictions.Eq("Id.Minor", 4));
IList<DatabaseVersion> list = crit.List<DatabaseVersion>();

вызывает следующую ошибку: NHibernate.QueryException: несоответствие типов в NHibernate.Criterion.SimpleExpression: Id.Minor ожидаемый тип System.Int16, фактический тип System.Int32

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

Добавлен файл сопоставления по запросу.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Core.NUnit.Domain.DatabaseVersion,Core.NUnit" table="`DatabaseVersion`" lazy="true" >
    <composite-id name="Id" class="Core.NUnit.Domain.DatabaseVersionId,Core.NUnit">
      <key-property name="Major" column="`Major`" />
      <key-property name="Minor" column="`Minor`" type="Int16"/>
      <key-property name="Build" column="`Build`" />
      <key-property name="Revision" column="`Revision`" />
    </composite-id>
    <property name="Description" column="`Description`"/>
    <property name="DateApplied" column="`DateApplied`"/>
  </class>
</hibernate-mapping>

1 Ответ

1 голос
/ 01 апреля 2009

Я думаю, что проблема может заключаться в том, что C # не может неявно приводить int к short. Похоже, ваше отображение отображает это поле в Int16 (короткий). «4», который вы передаете, по умолчанию выделяется как int. (Я не знаю, почему было бы сложно сравнить int с коротким ...)

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

crit.Add(Restrictions.Eq("Id.Minor", (short)4));
...