NHibernate流畅的映射 - 在运行时指定表?

时间:2014-07-23 15:52:27

标签: nhibernate fluent-nhibernate

问题: 如何将表示表名的字符串传递给NHibernate ClassMap?

详细信息: 我有几个几乎相同的数据库,在表和视图名称中有一些小的变化。我希望能够通过app.config文件中的配置参数来处理这些变化。例如,我可以使用以下自定义部分指定特定配置的表名:

<tableNames>
    <add key="logicalTable1" value="ACTUAL_TABLE_1"/>
    <add key="logicalTable2" value="ACTUAL_TABLE_2"/>
</tablenames>

现在,如果我在运行时加载这些配置参数,我如何将表名称输入ClassMap(即,

public class MyClassMap : ClassMap<MyClass>
{
    public class MyClassMap()
    {
         Table("ACTUAL_TABLE_1");   // <--- HERE I WANT Table(logicaTable1) 
    ...
}

注意:我正在使用Ninject注入ISessionFactory - 不确定这是否重要。

1 个答案:

答案 0 :(得分:1)

除非我遗漏了某些内容,否则你可以使用ConfigurationManager类:

public class MyClassMap()
{
  var table = ConfigurationManager.AppSettings["logicalTable2"];
  Table(table);
...
}

您的项目需要引用System.Configuration程序集。

<强>更新

或使用&#34; TableNameProvider&#34;类:

public interface ITableNameProvider
{
        string LogicalTable1 { get; }
}

public class TableNameProvider : ITableNameProvider
{
        public string LogicalTable1 { get { return ConfigurationManager.AppSettings["logicalTable1"]; } }
}

我不确定如何使用Ninject完成此操作,但假设它与其他容器一样:

public class MyClassMap()
{
  var provider = GetMyContainer().GetInstance<ITableProvider>();
  var table = provider.LogicalTable1;
  Table(table);
...
}

这样您只需要更改TableNameProvider类。

我不确定你是否可以在Fluent-NHibernate中注入MappingFactory或其他东西来处理映射文件依赖和真正的注入。需要注意的事情。