为什么Fluent NHibernate 1.3忽略我的约定?

时间:2012-03-07 17:07:59

标签: fluent-nhibernate

我一直在尝试从 NHibernate 2.3 迁移到 3.2 ,包括从 Fluent NHibernate 1.0 迁移到 1.3

升级后,通过搜索程序集拾取的Fluent约定似乎没有应用;我收到很多错误抱怨无法找到某些属性或列。

修改

我的映射设置如下所示:

.Mappings(
    m => m.FluentMappings
        .AddFromAssemblyOf<NHibernateMapping>()
        .Conventions.AddFromAssemblyOf<NHibernateMapping>())

我已经设法使用流畅的接口来加载所有约定,并在其构造函数上使用断点来跟踪它们何时被初始化。但是,实际上没有调用任何约定:Apply方法中没有任何断点被命中。

通过NHibernate显示的错误如下:

  

NHibernate.MappingException:无法在“标题”类中找到属性“全部”的setter

属性All没有setter - 其中一个约定应该更改映射以引用不同属性上的setter。

在检查正在导出的HBM文件时,我可以看到没有应用任何约定,并且正在使用默认的Fluent约定。

为什么我的约定没有应用于映射?

修改

通过反复试验,我发现问题出在AddFromAssemblyOf<T>()电话中。映射系统正在查找并初始化每个IConvention类型,但之后不会将它们添加到访问者,也不会将它们应用于映射。

发现的解决方法是使用Add<TConvention>()调用手动添加每个约定。这对我们有用,因为我们有一些惯例。编写一个替换AddFromAssemblyOf<T>()的扩展方法并不需要花费太多精力,如果有人需要更加强大的解决问题的方法。

仍然不确定为什么这不起作用,但现在感觉就像一个bug。

2 个答案:

答案 0 :(得分:0)

我成功使用以下(NH 3.2,FNH 1.3.0.717):

sessionFactory = Fluently.Configure(normalConfig)
                  .Mappings(m =>
                      m.FluentMappings
                      .AddFromAssemblyOf<OrderMap>()
                      .Conventions.AddFromAssemblyOf<PascalCaseColumnNameConvention>())
                      .ProxyFactoryFactory("NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate") 
                  .BuildSessionFactory();

答案 1 :(得分:0)

我们使用1.3并使用扩展方法添加所有约定:

 var config = Fluently.Configure()
                .Database(sqlConfig)
                .Mappings(GetMappings)
                .Diagnostics(x => x.Enable(Settings.EnableLogging))
                .Search(ConfigureSearch)
                .ExposeConfiguration(ExposeConfiguration);

protected void GetMappings(MappingConfiguration mappingConfiguration)
        {
            foreach (var assemblyName in AssemblyHelper.GetModelAssemblies())
            {
                var assembly = Assembly.Load(assemblyName);


     var assembly = Assembly.Load(assemblyName);

                    mappingConfiguration
                        .FluentMappings
                        .AddCustomConventions()
                        .AddFromAssembly(assembly);
}
}

public static AutoPersistenceModel AddCustomConventions(this AutoPersistenceModel autoPersistenceModel)
         {
             return
                     autoPersistenceModel
                     .Conventions.Add(typeof (StringLengthTypeConverter))
                     .Conventions.Add(typeof (GeneratedConvention))
                     .Conventions.Add(typeof (IndexPropertyConvention))
                     .Conventions.Add(typeof (LazyLoadPropertyConvention))
                     .Conventions.Add(typeof (LazyLoadClassConvention))
                     .Conventions.Add(typeof (FetchTypePropertyConvention))
                     .Conventions.Add(typeof (LazyLoadCollectionConvention))
                     .Conventions.Add(typeof (JsonStorageConvention))
                     .Conventions.Add(typeof (ManyToManyConvention))
                     .Conventions.Add(typeof (CustomForeignKeyConvention))
                     .Conventions.Add(typeof (CustomManyToManyTableNameConvention))
                     .Conventions.Add(typeof (HasManyConvention))
                     .Conventions.Add(typeof (IdConvention))
                     .Conventions.Add(typeof (PropertyConvention))
                     .Conventions.Add(typeof (ReferenceConvention))
                     .Conventions.Add(typeof (TableConvention))
                     .Conventions.Add(typeof (JoinedSubclassConvention));
         }