2011-12-12 1 views
2

Функция экспорта HBM в Fluent NHibernate, похоже, не работает.Fluent NHibernate (1.2.0.712) экспортные сопоставления с 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 для вызова), сгенерированные сопоставления вызывают исключение, как описано выше.

Если посмотреть на экспортированные сопоставления, то мои соглашения не применяются - например, у меня есть соглашение с внешним ключом, с использованием верблюжьего сундука и суффикса «ИД», но когда я экспортирую файлы 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.

Любые идеи?

ответ

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 теперь выход правильно!

+0

Автор (Джеймс Грегори) подтвердил, что эта функция является грубой и требует некоторой работы. Итак, эта работа - это путь, который нужно сделать сейчас - я закрываю эту тему и надеюсь, что этот ответ полезен кому-то другому. –

+0

спасибо, я только начал смотреть на некоторые экспортированные файлы hbm.xml, и я подумал, что я схожу с ума, задаваясь вопросом, почему мое соглашение об именах таблиц отсутствует. Это решило мои проблемы! – dotjoe

Смежные вопросы