为什么NHibernate会自动截断而不是在保存时抛出异常?
我一直在研究夏季的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
这不是NHiberante自动截断,这是你的数据库。你可以尝试不同的数据库,看看有些截断,有些则不可以配置。当太长的字符串发送到不截断的数据库时,Nhiberante引发异常。
您可以更具体地说“太长”吗? NHibernate或Db太长?我不明白这一点。 – pencilCake 2010-08-17 13:34:28
我的意思是比数据库列指定的更长。 – Paco 2010-08-17 19:05:34
如果删除
length="3"
应该trowing异常
我认为你的意思是“投掷” – 2012-11-14 23:16:14
你碰巧使用SQLite作为你的测试数据库?我在使用SQLite时遇到过这个问题。当我们将项目移至SQL Server时,代码开始在先前(使用SQLite)字符串被自动截断的地方抛出异常。如果您使用SQL Server,则可以通过服务器的配置来控制自动截断。请参阅http://msdn.microsoft.com/en-us/library/ms190368.aspx – 2010-08-17 04:42:53