流畅的NHibernate(1.2.0.712)导出映射到HBM不工作/不遵守约定

时间:2011-12-12 15:51:05

标签: nhibernate fluent-nhibernate export fluent hbm

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中遇到了这个问题。

有什么想法吗?

1 个答案:

答案 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文件!