我正在尝试使用NHibernate的内存测试,我在这个小项目中成功地做到了这一点:https://github.com/demojag/NHibernateInMemoryTest
正如你从物体的地图上看到的那样,我不得不评论这一行://SchemaAction.Noe();测试将失败。此选项隐藏模式导出
我想这只是我所做的评论,因为到目前为止,我还没有找到关于Schema Actions的严肃文档。
我之所以做这些测试,是因为我想在内存中测试现有的情况,但所有实体映射都有SchemaActions.None()选项,当我尝试执行内存中测试时,我会得到很多"没有这样的表"。
我想知道是否存在将Schema操作选项设置为none并导出模式的方法?(我知道这可能是违反封装的行为,所以这并没有多大意义)。
我想把这个选项设置为none,因为它是一个"DatabaseFirst"应用程序,我不能冒险在每次构建配置时删除数据库并重新创建它,但我想,如果在配置中我没有指定指令"exposeConfiguration"和SchemaExport,我会很安全。
谢谢你的建议
朱塞佩。
您应该能够通过NHibernate.Cfg.Configuration.BeforeBindMapping
事件覆盖HBM或Fluent NHibernate映射中的任何和所有设置,该事件允许您在程序运行时访问NHibernat的内部模型进行映射。请参阅下面的示例,该示例设置BeforeBindMapping事件处理程序,该事件处理程序将覆盖映射中指定的SchemaAction。
public NHibernate.Cfg.Configuration BuildConfiguration()
{
var configuration = new NHibernate.Cfg.Configuration();
configuration.BeforeBindMapping += OnBeforeBindMapping;
// A bunch of other stuff...
return configuration;
}
private void OnBeforeBindMapping( object sender, NHibernate.Cfg.BindMappingEventArgs bindMappingEventArgs )
{
// Set all mappings to use the fully qualified namespace to avoid class name collision
bindMappingEventArgs.Mapping.autoimport = false;
// Override the schema action to all
foreach ( var item in bindMappingEventArgs.Mapping.Items )
{
var hbmClass = item as NHibernate.Cfg.MappingSchema.HbmClass;
if ( hbmClass != null )
{
hbmClass.schemaaction = "all";
}
}
}