모호한 오류를 던지는 유창한 nhibernate automap 구성
-
13-11-2019 - |
문제
유창한 nhibernate의 automapptability를 시도하고 있으며, automapping으로 이동하려고 할 때 ClassMap
구성을 빌드 할 때 Per SessionFactory
구성을 수행 할 때 실패한 동일한 코드가 실패합니다.
여기 코드가 있습니다.
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;
}
.
INKEAT 오류는 다음과 같습니다.
유효하지 않거나 불완전한 구성 A를 만드는 동안 사용되었습니다 SessionFactory. 잠재력을 확인하십시오 컬렉션 및 InnerException. 자세한 내용.
Count = 0
용PotentialReasons
를 얻고 내부 예외는 위와 같습니다.스택 트레이스는 다음을 나타냅니다.
fluentnhibernate.cfg.FluentConfiguration.BuildSessionFactory () D : \ Builds \ fluentnh-v1.x-nh3 \ src \ fluentnhibernate \ cfg \ fluentconfiguration.cs : 113
모든 것을 시도한 것처럼 보이는 것처럼 보입니다. 그리고 가장 가까운 곳에서는 세션을 사용하려고했을 때
Could not find persister for...
오류를 얻기 위해 초기화 작업을 수행하는 것이 었습니다. 나는 그것을 얻을 수있었습니다.Nhibernate 3.0, SQL 2008 데이터베이스가있는 빌드 # 694를 사용하고 있습니다. 내가 뭘 잘못하고 있는지 아이디어
해결책
이것은 Aliostad의 의견이 나를 찾는 데 도움이되는 바보 같은 오류였습니다.데이터베이스의 정수로 저장된 enum 유형이 있었고 Nhibernate가 그 중에 질식되었습니다.다음과 같이 설정에 EnumConvention을 추가했습니다.
_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();
.
여기에 enum 협약이 있습니다 :
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);
}
}
.