我正在尝试Fluent NHibernate的自动化功能,当我尝试将其移动到自动化时构建ClassMap
时,使用显式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;
}
我得到的错误是:
配置无效或不完整 在创建时使用 SessionFactory的。检查PotentialReasons 集合和InnerException 更多细节。
Count = 0
获得PotentialReasons
,内部异常与上述相同。
stacktrace指的是:
在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数据库的build#694。我有什么想法吗?
答案 0 :(得分:2)
这是一个愚蠢的错误,Aliostad的评论帮助我找到了。我有一个在数据库中存储为整数的枚举类型,而且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();
这是枚举惯例:
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);
}
}