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

Fluent nhibernate 为什么Fluent NHibernate 1.3忽略了我的约定?,fluent-nhibernate,Fluent Nhibernate,我一直在尝试从NHibernate 2.3迁移到3.2,包括从Fluent NHibernate 1.0迁移到1.3 升级后,通过搜索程序集获取的Fluent约定似乎未应用;我收到许多错误,抱怨找不到某些属性或列 编辑: 我的映射设置如下所示: .Mappings( m => m.FluentMappings .AddFromAssemblyOf<NHibernateMapping>() .Conventions.AddFromAssem

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

升级后,通过搜索程序集获取的Fluent约定似乎未应用;我收到许多错误,抱怨找不到某些属性或列

编辑:

我的映射设置如下所示:

.Mappings(
    m => m.FluentMappings
        .AddFromAssemblyOf<NHibernateMapping>()
        .Conventions.AddFromAssemblyOf<NHibernateMapping>())
.Mappings(
m=>m.FluentMappings
.AddFromAssemblyOf()的
.Conventions.AddFromAssemblyOf())
我已经设法让fluent接口加载所有约定,并在它们的构造函数上设置一个断点,以便在初始化时跟踪它们。但是,实际上没有调用任何约定:它们的
Apply
方法中没有断点被命中

通过NHibernate显示的错误如下:

NHibernate.MappingException:在类“Headline”中找不到属性“All”的setter

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

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

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

编辑:

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

发现的一个解决方法是使用
add()
调用手动添加每个约定。这对我们很有效,因为我们有一些约定。如果有人需要更可靠的解决方法,那么编写一个扩展方法来替换
AddFromAssemblyOf()
,就不需要花费太多精力


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

我成功地使用了以下内容(NH3.2,FNH 1.3.0.717):

sessionFactory=fluntly.Configure(normalConfig)
.Mappings(m=>
m、 FluentMappings
.AddFromAssemblyOf()的
.Conventions.AddFromAssemblyOf())
.proxyFactory(“NHibernate.Bytecode.defaultproxyFactory,NHibernate”)
.BuildSessionFactory();

我们使用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));
         }

您的所有约定是否在不同的程序集中?是的。我们使用数据配置DLL中的一组约定在启动时配置站点。所有模型都存在于已向站点注册的dll中。所以您只有一个存储所有约定的配置dll?我想我要说的是,你是否可以使用
约定。AddFromAssemblyOf()
而不是手动添加每个约定。对我来说,这绝对是个bug!建议您在报告,甚至提交修复。
 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));
         }