NHibernate.TypeMismatchException: предоставлен идентификатор неправильного типа. Ожидаемый: System.Int32, получил System.Int64 - PullRequest
3 голосов
/ 13 января 2010

Я использую следующий запрос для получения клиента. У клиента есть открытый идентификатор типа 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. Как только я изменил его тип на long, ошибка исчезла.

Мои отображения таковы:

ClientMap:

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

ReportMap:

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

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

1 Ответ

5 голосов
/ 19 января 2010

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

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

...