NHibernate.TypeMismatchException:提供的id类型错误。应为:System.Int32,获得System.Int64

NHibernate.TypeMismatchException:提供的id类型错误。应为:System.Int32,获得System.Int64,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我使用以下查询获取客户机。客户机具有long类型的公共Id var client = Session.CreateQuery("from Client as c where c.Id = :Id").SetParameter("Id", 1, NHibernateUtil.Int64).UniqueResult<Client>(); 那么,为什么要通过将reportid的类型从int改为long来解决问题呢。第二,为什么在我不需要报表的时候还要费心去获取报表呢?一对一键需要具有相同

我使用以下查询获取客户机。客户机具有long类型的公共Id

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

那么,为什么要通过将reportid的类型从int改为long来解决问题呢。第二,为什么在我不需要报表的时候还要费心去获取报表呢?

一对一键需要具有相同的类型定义,因为它们使用相同的值。因此,ID=Int32.MaxValue+1的客户机将有一个ID=Int32.MaxValue+1的对应报告,因此它们必须都是
长的

我推荐这些文章来了解一对一以及大多数情况下你是如何真正不需要它的:

  • ?

您能否详细说明自定义字节码提供程序的问题是什么?我似乎也遇到了同样的问题,并且已经证明了这是我的提供者——但是这些信息中没有足够的内容让我理解为什么。
var client = Session.Get<Client>(1L); //Or
var client = Session.CreateCriteria<Client>().Add(Restrictions.Eq("Id", 1L)).UniqueResult<Client>();
HasOne<Report>(x => x.Report)
   .PropertyRef(x => x.Client)
   .LazyLoad()
   .Cascade.SaveUpdate();
References(x => x.Client, "clientID").Unique();