NHibernate.TypeMismatchException: предоставлен идентификатор неправильного типа. Ожидается: System.Int32, получил System.Int64

Я использую следующий запрос, чтобы получить клиента. Клиент имеет публичный идентификатор типа long.

var client = Session.CreateQuery("from Client as c where c.Id = :Id").SetParameter("Id", 1, NHibernateUtil.Int64).UniqueResult<Client>();

Получаю сообщение об ошибке:

NHibernate.TypeMismatchException: предоставлен идентификатор неправильного типа. Ожидается: System.Int32, получил System.Int64

В то же время прекрасно работает следующее.

var client = Session.Get<Client>(1L); //Or
var client = Session.CreateCriteria<Client>().Add(Restrictions.Eq("Id", 1L)).UniqueResult<Client>();

Что мне не хватает? Я использую свободный nhibernate для создания сопоставлений. Я протестировал запросы к базе данных Sqlite и MySql. Те же результаты.

Edit1: генерация схемы из сопоставлений явно использует bigint для первичного ключа в mysql. Вот почему я не могу понять, что ждет Int32?

Edit2: хорошо, у моего класса Client есть ссылка на объект Report. На самом деле это взаимно-однозначное отношение в базе данных с таблицей отчета, имеющей столбец clientID. Класс Report имел идентификатор типа int. Как только я изменил его тип на длинный, ошибка исчезла.

Мои сопоставления следующие:

ClientMap:

HasOne<Report>(x => x.Report)
   .PropertyRef(x => x.Client)
   .LazyLoad()
   .Cascade.SaveUpdate();

ReportMap:

References(x => x.Client, "clientID").Unique();

Итак, почему проблема решилась сама собой, изменив тип репортида с int на long. Во-вторых, зачем даже получать отчет, когда я его не прошу?


person Amith George    schedule 13.01.2010    source источник
comment
Не могли бы вы подробнее рассказать, в чем заключалась проблема с вашим поставщиком пользовательского байт-кода? Кажется, у меня такая же проблема, и я доказал, что это мой провайдер, но сообщений недостаточно, чтобы я понял, почему.   -  person Cort    schedule 20.07.2011


Ответы (1)


Однозначные ключи должны иметь одно и то же определение типа, поскольку они используют одни и те же значения. Таким образом, у клиента с ID = Int32.MaxValue + 1 будет соответствующий отчет с ID = Int32.MaxValue + 1, поэтому оба они должны быть long.

Я рекомендую эти статьи, чтобы понять индивидуально и понять, как в большинстве случаев вам это действительно не нужно:

person Mauricio Scheffer    schedule 19.01.2010