NHibernate.TypeMismatchException:提供错误类型的id。预期:System.Int32,得到System.Int64

时间:2010-01-13 08:07:17

标签: nhibernate nhibernate-mapping

使用以下查询获取客户端。客户端的公共ID类型为long。

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

得到错误:

  

NHibernate.TypeMismatchException:提供错误类型的id。预期: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对象。它实际上是db中的一对一关系,报告表具有列clientID。 Report类的id为int类型。一旦我将其类型更改为long,错误就消失了。

我的映射如下:

ClientMap:

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

ReportMap:

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

那么,为什么问题通过将reportid的类型从int更改为long来解决。其次,为什么在我不提出要求时,甚至会费心去取报告呢?

1 个答案:

答案 0 :(得分:5)

一对一密钥需要具有相同的类型定义,因为它们使用相同的值。因此,ID = Int32.MaxValue + 1的客户端将具有ID = Int32.MaxValue + 1的相应报表,因此它们必须都是long

我建议这些文章一对一地理解,以及大多数时候你并不真正需要它: