Fluent NHibernate中的HBM导出功能似乎不起作用。
如果我调用FluentMappingsContainer.ExportTo,生成的映射出错了,我得到以下异常:
FluentNHibernate.Cfg.FluentConfigurationException: An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
我的配置代码如下所示:
MsSqlConfiguration database = MsSqlConfiguration.MsSql2008
.ConnectionString(GetConnectionString())
.Cache(c => c
.UseQueryCache()
.UseSecondLevelCache()
.ProviderClass<SysCacheProvider>()
);
database.ShowSql();
FluentConfiguration config = Fluently.Configure()
.Database(database)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Entity>()
.Conventions.AddFromAssemblyOf<Entity>());
config.ExposeConfiguration(x =>
{
x.SetProperty("hbm2ddl.keywords", "auto-quote");
x.SetInterceptor(new ServiceInterceptor());
});
config.ExposeConfiguration(x => { x.SetProperty("current_session_context_class", "thread_static"); });
// Configure HBM export path, if configured:
var path = Service.Config.HbmExportPath;
if (!String.IsNullOrEmpty(path))
config.Mappings(m => m.FluentMappings.ExportTo(path));
// Build session factory:
_sessionFactory = config.BuildSessionFactory();
将我的配置中的HbmExportPath设置为null,应用程序启动并运行没有问题。一旦配置了导出路径(导致调用ExportTo),生成的映射就会导致异常,如上所述。
查看导出的映射,看起来我的约定没有被应用 - 例如,我有一个外键约定,使用camel-case和“Id”后缀,但是当我导出HBM文件时,密钥始终以下划线和小写“_id”命名,例如:
<class xmlns="urn:nhibernate-mapping-2.2" name="MyApp.Entities.Contact, MyApp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Contact`">
...
<bag name="Departments" table="ContactDepartment">
<key>
<column name="Contact_id" />
</key>
<many-to-many class="MyApp.Entities.Department, MyApp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<column name="Department_id" />
</many-to-many>
</bag>
...
</class>
我在之前的版本和当前版本的Fluent中遇到了这个问题。
有什么想法吗?
答案 0 :(得分:3)
在深入了解Fluent源代码(最新的Git存储库)之后,对我来说很奇怪。
ExportTo()方法定义了两次 - 一次是由FluentConfiguration本身定义的,并且它确实显示它“太快”导出配置文件,导致配置不完整,在运行时(导致上述异常)和在出口时。
奇怪的是,PersistenceModel类型确实能够导出完整配置,但不会公开此功能。相反,至少还有两个看似破坏的ExportTo()实现。
要解决这个问题,我们需要访问PersistenceModel实例,该实例能够编写完整的配置 - 幸运的是,我找到了一种方法:
// create a local instance of the PersistenceModel type:
PersistenceModel model = new PersistenceModel();
FluentConfiguration config = Fluently.Configure()
.Database(database)
.Mappings(m => m.UsePersistenceModel(model) // use the local instance!
.FluentMappings.AddFromAssemblyOf<Entity>()
.Conventions.AddFromAssemblyOf<Entity>());
// ...
var path = Service.Config.HbmExportPath;
_sessionFactory = config.BuildSessionFactory(); // completes the configuration
// now write out the full mappings from the PersistenceModel:
if (!String.IsNullOrEmpty(path))
model.WriteMappingsTo(path);
现在正在正确输出HBM文件!