是否可以将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){}
}