Rhino.Commons + Fluent NHibernate

时间:2009-01-12 22:51:05

标签: fluent-nhibernate rhino rhino-commons

有没有办法将Rhino.Commons与Fluent Nhibernate一起使用(特别是AutoMapping)?

非常感谢

fromano

1 个答案:

答案 0 :(得分:2)

##########

更新:
这个答案是在2009年2月写的。随着FluentNHibernate项目的变化速度,很可能已经重命名了该方法,或者已经移动了更改约定的机制。

##########

我想使用来自Rhino.Commons.ForTesting的DatabaseTextFixtureBase和FluentNHibernate。我一直遇到的问题是,FluentNHibernate为PersistenceModel类中的NHibernate配置添加了它的魔力,并且一旦调用DatabaseTestFixtureBase,就开始使用NHibernate配置.InitializeNHibernateAndIoC()Rhino.Commons私下做了很多事情。并且您无法再访问NHibernate配置。

事实证明,我最后的假设是错误的。如果您向容器注册INHibernateInitializationAware服务,它将在调用CreatConfigs()时由NHibernateUnitOfWorkTestContext获取。

我使用的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){}
}