为什么NHibernate自动截断而不是在保存时抛出异常?

时间:2010-08-17 04:14:17

标签: .net unit-testing nhibernate transactions nhibernate-mapping

我一直在研究夏季的NHibernate教程,当我到达会话04:探索事务和并发 - 就像在教程中一样 - 我想创建一个SAVE测试,它应该因为对象无效而失败。

目的是测试它是否可以正确回滚事务。

想法是创建一个无效对象,其属性的字符数多于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 =在映射文件中设置的长度?如何防止这种情况发生,以便在保存时失败?

谢谢, burak ozdogan

2 个答案:

答案 0 :(得分:4)

自动截断不是NHiberante,它是您的数据库。您可以尝试使用不同的数据库,并查看某些数据截断,有些则不能,其他数据库可配置。当将非常长的字符串发送到不截断的数据库时,Nhiberante会抛出异常。

答案 1 :(得分:0)

如果删除

length="3"

它应该抛出异常