2

여름 NHibernate 튜토리얼을 공부하고 있으며 세션 04 : 트랜잭션 및 동시성 탐색 - 튜토리얼 에서처럼 유효하지 않은 객체로 인해 실패해야하는 SAVE 테스트를 만들고 싶습니다.왜 저장시 예외를 던지기보다는 Hibernate가 자동으로자를 수 있습니까?

목적은 트랜잭션을 올바르게 롤백 할 수 있는지 테스트하는 것입니다.

아이디어는 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

당신이 당신의 테스트 DB로 SQLite는 사용하는 일이 마십시오 예외를 trowing해야

length="3" 

를 제거하면? 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

당신이

+0

나는 당신이 "던지는" –

관련 문제