有没有办法将Rhino.Commons与Fluent Nhibernate一起使用(特别是AutoMapping)?
非常感谢
fromano
答案 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){}
}