是否可以将Rhino.Commons与Fluent Nhibernate(特别是AutoMapping)一起使用?

非常感谢

Fromano

最佳答案

##########

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

##########

我想将Rhino.Commons.ForTesting的DatabaseTextFixtureBase与FluentNHibernate一起使用。我一直遇到的问题是FluentNHibernate在PersistenceModel类的NHibernate配置中添加了魔力,并在调用DatabaseTestFixtureBase.InitializeNHibernateAndIoC()Rhino.Commons私下做了很多事情之后就开始使用NHibernate配置。并且您不再有权访问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){}
}

10-08 01:49