2011-03-28 2 views
2

Fluent NHibernate의 오토 맵핑 기능을 시험하고 있습니다. 명시적인 ClassMap 설정과 동일한 코드가 SessionFactory을 automapping으로 옮길 때 실패 할 것입니다.Fluent NHibernate automap 설정이 모호한 에러를 던졌습니다

public static ISessionFactory GetSessionFactory() 
{ 
    if (_sessionFactory == null) 
    { 
     _sessionFactory = Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("DB"))) 
      // It works with the following: 
      // .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Customer>()) 
      // It fails with this: 
      .Mappings(m => m.AutoMappings.Add(AutoMap.AssemblyOf<Customer>())) 
      .BuildSessionFactory(); 

    return _sessionFactory; 
} 

내가 오류는 다음과 같습니다하십시오 SessionFactory를 생성하는 동안

잘못되었거나 불완전한 구성 사용 하였다

여기에 코드입니다. PotentialReasons 컬렉션을 확인하고 에 대한 InnerException을 확인하십시오.

PotentialReasons에 대해서는 Count = 0이고 내부 예외는 위와 같습니다. \ 빌드 \ FluentNH-v1.x-NH3 \ SRC \ FluentNHibernate \ CFG \ FluentConfiguration.cs : d의 FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory()에서

스택 트레이스를 말한다 : 나는 그것이 작동하도록하기 위해 모든 노력을 것 같은 라인은 113

보인다, 내가 온 가장 가까운 내가 세션을 사용하려고 할 때 Could not find persister for... 오류 만 초기화 작업을했다, 나는 돈 내가 어떻게 그 일이 일어날 수 있었는지 기억하지 못한다.

저는 NHibernate 3.0, SQL 2008 데이터베이스와 함께 빌드 # 694를 사용하고 있습니다. 내가 뭘 잘못하고 있는거야?

+2

:

_sessionFactory = Fluently.Configure() .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("DB"))) .Mappings( m => m.AutoMappings.Add(AutoMap.AssemblyOf<Customer>(new AutomapConfiguration()).Conventions. Setup(c => { c.Add<PrimaryKeyConvention>(); c.Add<EnumConvention>(); c.Add<CascadeAllConvention>(); }) .IgnoreBase(typeof (EntityBase<>)) .OverrideAll(map => map.IgnoreProperty("IsValid")))) .BuildSessionFactory(); 

는 여기에 열거 규칙입니다. 그들 모두를 살펴 보셨습니까? – Aliostad

+0

와우 ... 나는 바보처럼 느껴진다! 당신은 절대적으로 옳습니다. 드릴 다운 할 때 열거 형 매핑 문제가 있다는 것을 알았습니다. 내 명시적인 매핑에서 나는 단지'CustomType (typeof (MyEnum)) '을했지만, automapping 할 때 이것이 가능한지 어떻게 봐야 할 것입니다 ... –

답변

2

이것은 Aliostad의 의견을 찾는데 도움이되는 바보 같은 오류입니다. 데이터베이스에 정수로 저장된 열거 형을 가지고 있었고 NHibernate가 질식했습니다. 이 같은 설정에 EnumConvention을 추가 : 중첩 된 내부 예외의 3-4 수준이 보통이 있습니다

public class EnumConvention : IUserTypeConvention 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Property.PropertyType.IsEnum); 
    } 

    public void Apply(IPropertyInstance target) 
    { 
     target.CustomType(target.Property.PropertyType); 
    } 
}