Rhino.Commons + Свободный NHibernate - PullRequest
3 голосов
/ 13 января 2009

Есть ли способ использовать Rhino.Commons с Fluent Nhibernate (в частности, с AutoMapping)?

Большое спасибо

fromano

1 Ответ

2 голосов
/ 03 февраля 2009

# # # # # # # # # #

UPDATE:
Этот ответ был написан в феврале 2009 года. Учитывая скорость изменения проекта FluentNHibernate, весьма вероятно, что метод был переименован или механизм изменения конвенций был перемещен.

# # # # # # # # # #

Я хотел использовать DatabaseTextFixtureBase из Rhino.Commons.ForTesting с FluentNHibernate. Проблема, с которой я постоянно сталкивался, заключалась в том, что FluentNHibernate добавляет свою магию в конфигурацию NHibernate в классе PersistenceModel, и попал в руки к конфигурации NHibernate после вызова DatabaseTestFixtureBase.InitializeNHibernateAndIoC (). Rhino.Commons делает кучу вещей в частном порядке. и у вас больше нет доступа к конфигурации NHibernate.

Как оказалось, мое последнее предположение было неверным. Если вы зарегистрируете службу INHibernateInitializationAware в контейнере, она будет подхвачена NHibernateUnitOfWorkTestContext при вызове CreatConfigs ().

Используемая мной реализация INHibernateInitializationAware выглядит следующим образом:

public class FluentNHibernateInitializationAwareConfigurator : INHibernateInitializationAware
{
    public void BeforeInitialization(){}

    public void Configured(Configuration cfg)
    {
        var persistenceModel = new PersistenceModel
                                   {
                                       Conventions =
                                           {
                                               GetForeignKeyName = (prop => prop.Name + "Id"),
                                               GetForeignKeyNameOfParent = (prop => prop.Name + "Id")
                                           }
                                   };
        persistenceModel.addMappingsFromAssembly(typeof(OneOfMyMappingClasses).Assembly);
        persistenceModel.Configure(cfg);

    }

    public void Initialized(Configuration cfg, ISessionFactory sessionFactory){}
}

Конечно, условные обозначения могут быть заменены любыми, которые вы используете.

Наслаждайтесь!


Если вы используете последнюю версию FluentNHibernate, возможно, вы используете класс Fluently для настройки ваших сопоставлений. Вот еще одна версия FluentNHibernateInitializationAwareConfigurator:

public class FluentNHibernateInitializationAwareConfigurator : INHibernateInitializationAware  
{  
    public void BeforeInitialization(){}  

    public void Configured(Configuration cfg)  
    {
        Fluently.Configure().Mappings(m =>
        {
            m.FluentMappings.AddFromAssemblyOf<User>()
                .AlterConventions(convention =>
                    {
                        convention.GetForeignKeyName = (prop => prop.Name + "Id");
                        convention.GetForeignKeyNameOfParent = (prop => prop.Name + "Id");
                    }
                );
            m.Apply(cfg);
        });
    }  

    public void Initialized(Configuration cfg, ISessionFactory sessionFactory){}
}
...