Свободный экспорт NHibernate (1.2.0.712) в HBM не работает / не соблюдает соглашения - PullRequest
2 голосов
/ 12 декабря 2011

Функция экспорта HBM в Fluent NHibernate, похоже, не работает.

Если я вызываю 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 в моей конфигурации на ноль, приложение запускается и работает без проблем. Как только я настраиваю путь экспорта (вызывая ExportTo), сгенерированные отображения вызывают исключение, как описано выше.

Глядя на экспортированные отображения, кажется, что мои соглашения не применяются - например, у меня есть соглашение по внешнему ключу, использующее регистр верблюдов и суффикс "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 Ответ

3 голосов
/ 13 декабря 2011

После детализации исходного кода 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 теперь выводятся правильно!

...