2

Я изучаю Summer of NHibernate Tutorials, и когда я достиг сеанса 04: Изучение транзакций и параллелизма - как и в учебнике - я хотел создать тест SAVE, который должен завершиться неудачно из-за недопустимого объекта.Почему 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 = длина, заданная в файле сопоставления? Как я могу предотвратить это, чтобы он мог сбой при сохранении?

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

+2

ли случится использовать SQLite в качестве тестирования БД? Я столкнулся с этим сам, когда использовал SQLite. Когда мы переместили наш проект на SQL Server, код начал бросать исключения в местах, где ранее (с SQLite) строка была автоматически усечена. Если вы используете SQL Server, вы можете управлять автоматическим усечением через конфигурацию сервера. См. Http://msdn.microsoft.com/en-us/library/ms190368.aspx –

ответ

4

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

+0

Можете ли вы более конкретно сказать «слишком долго»? Слишком долго для NHibernate или для Db? Я не могу понять. – pencilCake

+0

Я имею в виду дольше, чем указывает столбец базы данных. – Paco

0

Если удалить

length="3" 

следует trowing исключение

+0

Я думаю, вы имеете в виду "бросать" –

Смежные вопросы