3

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

非常感谢

从诺

4

1 回答 1

2

##########

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

##########

我想将来自 Rhino.Commons.ForTesting 的 DatabaseTextFixtureBase 与 FluentNHibernate 一起使用。我一直遇到的问题是,FluentNHibernate 在 PersistenceModel 类中的 NHibernate 配置中添加了它的魔力,并且一旦你调用 DatabaseTestFixtureBase.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){}
}
于 2009-02-03T04:52:27.573 回答