NHibernate fluent映射-在运行时指定表?
问题: 如何将表示表名的字符串传递给NHibernate类映射 详细信息: 我有几个几乎相同的数据库,表和视图名称有一些细微的变化。我希望能够通过app.config文件中的配置参数处理这些变化。例如,我可以使用以下自定义部分为特定配置指定表名:NHibernate fluent映射-在运行时指定表?,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,问题: 如何将表示表名的字符串传递给NHibernate类映射 详细信息: 我有几个几乎相同的数据库,表和视图名称有一些细微的变化。我希望能够通过app.config文件中的配置参数处理这些变化。例如,我可以使用以下自定义部分为特定配置指定表名: <tableNames> <add key="logicalTable1" value="ACTUAL_TABLE_1"/> <add key="logicalTable2" value="ACTUAL_T
<tableNames>
<add key="logicalTable1" value="ACTUAL_TABLE_1"/>
<add key="logicalTable2" value="ACTUAL_TABLE_2"/>
</tablenames>
现在,如果我在运行时加载这些配置参数,那么如何将表名放入类映射(即
公共类MyClassMap:ClassMap
{
公共类MyClassMap()
{
Table(“ACTUAL_Table_1”);//除非我遗漏了什么,否则您可以使用ConfigurationManager
类:
public class MyClassMap()
{
var table = ConfigurationManager.AppSettings["logicalTable2"];
Table(table);
...
}
您的项目需要引用系统配置
程序集
更新:
或者使用“TableNameProvider”类:
我不确定如何使用Ninject实现这一点,但假设它与其他容器类似:
public class MyClassMap()
{
var provider = GetMyContainer().GetInstance<ITableProvider>();
var table = provider.LogicalTable1;
Table(table);
...
}
公共类MyClassMap()
{
var provider=GetMyContainer().GetInstance();
var table=provider.LogicalTable1;
表(表);
...
}
这样,您只需要更改TableNameProvider类
我不确定是否可以将MappingFactory或其他东西注入到Fluent NHibernate中,以处理映射文件依赖项和真实注入。需要研究的东西。我唯一的犹豫是,它实际上是在创建对全局对象的依赖项。例如,自定义部分是NamedValueFileSectionHandler——如果我我想在将来改变它吗?这需要修改每个映射类。有趣的方法。我不知道ITableNameProvider
存在。我想建议映射类可以有一个允许设置表的公共属性,您可以在构建SessionFactory
ITableProvider
不存在,它只是一个用于上面我的实现的接口。
public interface ITableNameProvider
{
string LogicalTable1 { get; }
}
public class TableNameProvider : ITableNameProvider
{
public string LogicalTable1 { get { return ConfigurationManager.AppSettings["logicalTable1"]; } }
}
public class MyClassMap()
{
var provider = GetMyContainer().GetInstance<ITableProvider>();
var table = provider.LogicalTable1;
Table(table);
...
}