2010-01-13 94 views
3

我正在使用以下查詢來獲取客戶端。客戶有一個long類型的公共標識。NHibernate.TypeMismatchException:提供了錯誤類型的ID。預期:System.Int32,得到System.Int64

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

正在錯誤:

NHibernate.TypeMismatchException: Provided id of the wrong type. Expected: System.Int32, got System.Int64

與此同時,下面的工作就好了。

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

我在想什麼?我使用流利的nhibernate來創建映射。我已經測試了針對Sqlite和MySql數據庫的查詢。相同的結果。

編輯1:從映射中清晰地生成模式是使用bigint作爲mysql上的主鍵。這就是爲什麼我無法理解什麼期待Int32?

Edit2:好的,我的Client類有一個Report對象的引用。它實際上是db中的一對一關係,並且報表具有列clientID。 Report類有一個int類型的id。一旦我改變了它的類型,錯誤消失了。

我的映射如下所示:

ClientMap:

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

ReportMap:

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

那麼,爲什麼這個問題,通過改變從int的reportid的類型自行解決漫長。其次,爲什麼在我沒有要求的時候拿到報告還是很麻煩?

+0

你能詳細說明你的自定義字節碼提供程序的問題是什麼?我似乎有同樣的問題,並已證明它是我的提供者 - 但是沒有足夠的信息讓我理解爲什麼。 – Cort 2011-07-20 19:20:39

回答

5

由於使用相同的值,所以一對一的鍵需要具有相同的類型定義。因此,ID = Int32.MaxValue + 1的客戶端將具有相應的ID = Int32.MaxValue + 1的報表,因此它們必須都是long

我建議這些文章來了解一個對一個,以及如何大多數時候,你並不真的需要它:

相關問題