2013-02-19 25 views
0

我有一個我想更新的瞬態對象的列表,全部來自同一張表。NHibernate更新多個瞬態對象異常:脫水屬性值的錯誤

IList<MyObject> objectsToUpdate = GetObjectsToUpdate(); 
using (var session = GetSession()) 
using (var transaction = session.BeginTransaction()) 
{ 
    foreach (var obj in objectsToUpdate) 
    { 
     obj.Property = "new value"; 
     session.Update(obj); 
    } 
    transaction.Commit(); //exception thrown here 
} 

異常消息:錯誤脫水屬性值MyObject.Property 內部異常消息:字符串值的長度超過在映射/參數配置的長度。

異常消息沒有意義,因爲映射中沒有長度配置,並且字符串在該範圍內。

我能夠來解決這個問題:

1)調用調用Session.flush()調用session.Update後(OBJ)

IList<MyObject> objectsToUpdate = GetObjectsToUpdate(); 
using (var session = GetSession()) 
using (var transaction = session.BeginTransaction()) 
{ 
    foreach (var obj in objectsToUpdate) 
    { 
     obj.Property = "new value"; 
     session.Update(obj); 
     session.Flush(); 
    } 
    transaction.Commit(); 
} 

OR

2)呼叫會話。合併(obj),修改其屬性,然後一次全部提交。

IList<MyObject> objectsToUpdate = GetObjectsToUpdate(); 
using (var session = GetSession()) 
using (var transaction = session.BeginTransaction()) 
{ 
    foreach (var obj in objectsToUpdate) 
    { 
     obj = session.Merge(obj); 
     obj.Property = "new value"; 
    } 
    transaction.Commit() 
} 

不過,我想知道爲什麼在提交事務時多更新調用後沒有每次更新後沖洗異常被拋出。

有人能解釋一下嗎?

+0

什麼RDBMS?哪個NHibernate版本? – 2013-02-19 08:16:08

+0

Sybase ASE 15.5和NHibernate 3.3.2.4000 – minh 2013-02-19 14:12:49

回答

0

字符串屬性的默認長度爲255,如從映射中生成表格時所看到的。指定屬性更大的長度可容納字符串,長度大於255

+0

表格不是從映射生成的,字符串也在定義的範圍內。 – minh 2013-02-19 15:13:45

0

這聽起來像你可能會碰到以下問題: https://nhibernate.jira.com/browse/NH-3355

據報道,爲Sybase,但我無法重現它。請閱讀關於問題報告的評論。你使用的ADO.NET提供程序的什麼(文件)版本?

+0

Sybase.AdoNet2.AseClient.dll文件版本1.15.186.0 我將查看該JIRA票證。 – minh 2013-02-19 15:39:06

+0

聽起來像我在測試時使用的版本比舊版本更低,所以它與我的理論一致,即它是早期版本提供程序中的錯誤。請看看你是否可以在這裏或錯誤報告中嘗試使用更新後的版本和評論。 – 2013-02-19 15:48:38

相關問題