Почему NHibernate автоматически усекает, а не выдает исключение при сохранении? - PullRequest
2 голосов
/ 17 августа 2010

Я изучал учебники Summer Of 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 = длина установлена ​​в файле отображения? Как я могу предотвратить это, чтобы он мог потерпеть неудачу при сохранении?

Спасибо, Бурак Оздоган

Ответы [ 2 ]

4 голосов
/ 17 августа 2010

Это не NHiberante, который автоматически усекает, это ваша база данных. Вы можете попробовать разные базы данных и увидеть, что некоторые усекаются, а некоторые нет, а другие настраиваются. Nhiberante создает исключительную ситуацию, когда слишком длинная строка отправляется в базу данных, которая не усекается.

0 голосов
/ 10 августа 2011

Если вы удалите

length="3"

должно быть исключение

...