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