有没有一种方法可以将Rhino.Commons与Fluent Nhibernate一起使用(特别是AutoMapping)?
非常感谢。
fromano
非常感谢。
fromano
更新:
这篇答案是在2009年2月写的。由于FluentNHibernate项目的变化速度非常快,很可能该方法已被重命名,或者更改约定的机制已经移动。
我想在Rhino.Commons.ForTesting中使用DatabaseTextFixtureBase和FluentNHibernate。 问题在于,FluentNHibernate在PersistenceModel类中向NHibernate配置添加了其魔力,一旦调用DatabaseTestFixtureBase.InitializeNHibernateAndIoC()就无法获取NHibernate配置,因为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){}
}