Ami*_*rge 3 nhibernate nhibernate-mapping
我使用以下查询来获取客户端.客户端的公共ID类型为long.
var client = Session.CreateQuery("from Client as c where c.Id = :Id").SetParameter("Id", 1, NHibernateUtil.Int64).UniqueResult<Client>();
Run Code Online (Sandbox Code Playgroud)
得到错误:
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>();
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我使用流利的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();
Run Code Online (Sandbox Code Playgroud)
ReportMap:
References(x => x.Client, "clientID").Unique();
Run Code Online (Sandbox Code Playgroud)
那么,为什么问题通过将reportid的类型从int更改为long来解决.其次,为什么在我没有要求时,它甚至还在费心去取报告呢?
一对一密钥需要具有相同的类型定义,因为它们使用相同的值.因此,ID = Int32.MaxValue + 1的客户端将具有ID = Int32.MaxValue + 1的相应报表,因此它们必须是两者long
.
我建议这些文章一对一地理解,大多数时候你并不真正需要它:
归档时间: |
|
查看次数: |
5412 次 |
最近记录: |