2

我一直在研究夏季的NHibernate教程,當我已經達到了04屆:探索事務和併發 - 只是像教程 - 我想創建一個保存測試,因爲無效目標應該失敗。爲什麼NHibernate會自動截斷而不是在保存時拋出異常?

目的是測試它是否可以正確回滾事務。

想法是創建具有與比DB中設置所需量更多字符的性質的無效對象。但是NHibernate做的是獲取第一個所需的字符數量,並將其餘部分剪切併成功保存到Db

這裏是我的測試不失敗:

[Test] 
public void AddCountryThrowExceptionOnFail() 
{ 
    // This returns a Country with country code having more than 50 chars 
    // Where its length is set to 3 chars only   
    Country invalidCountry = GetInvalidCountry(); 
    _dataProvider.AddCountry(invalidCountry); 
} 

這是AddCountry方法:

public int AddCountry(Country country) 
{ 
using (ISession session = GetSession()) 
{ 
    using (ITransaction tx = session.BeginTransaction()) 
    { 
     try 
     { 
      int pk_Country = (int)session.Save(country); 
      session.Flush(); 

      tx.Commit(); 

      return pk_Country; 
     } 
     catch(Exception) 
     { 
      tx.Rollback(); 
      throw; 
     } 
    } 
} 
} 

這是映射文件是如何設置COUNTRYCODE屬性:

<property name="CountryCode" column="CountryCode" type="string" length="3" not-null="true"></property> 

所以,問題是,爲什麼NHibernate獲得第一個N個字符,其中n =在映射文件中設置的長度?我怎樣才能防止這種情況發生,使它可以保存失敗?

感謝, 布拉克ozdogan

+2

你碰巧使用SQLite作爲你的測試數據庫?我在使用SQLite時遇到過這個問題。當我們將項目移至SQL Server時,代碼開始在先前(使用SQLite)字符串被自動截斷的地方拋出異常。如果您使用SQL Server,則可以通過服務器的配置來控制自動截斷。請參閱http://msdn.microsoft.com/en-us/library/ms190368.aspx – 2010-08-17 04:42:53

回答

4

這不是NHiberante自動截斷,這是你的數據庫。你可以嘗試不同的數據庫,看看有些截斷,有些則不可以配置。當太長的字符串發送到不截斷的數據庫時,Nhiberante引發異常。

+0

您可以更具體地說「太長」嗎? NHibernate或Db太長?我不明白這一點。 – pencilCake 2010-08-17 13:34:28

+0

我的意思是比數據庫列指定的更長。 – Paco 2010-08-17 19:05:34

0

如果刪除

length="3" 

應該trowing異常

+0

我認爲你的意思是「投擲」 – 2012-11-14 23:16:14

相關問題