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

相关问题