流畅的NHibernate自动配置抛出模糊错误

时间:2011-03-28 12:28:35

标签: c# fluent-nhibernate automapping

我正在尝试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。我有什么想法吗?

1 个答案:

答案 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);
    }
}