如何使用Nhibernate与变量或动态表名称,如Jan08Tran,Feb08Tran,Mar08Tran

Sac*_*van 9 .net nhibernate

我有遗留数据库,其中事务表按月名存储.

例如.

     Jan08Tran
     Feb08Tran
Run Code Online (Sandbox Code Playgroud)

我如何使用NHibernate来处理这个表?

阅读一下有关entity-name属性,SubClass等的内容.但是无法找到具体的解决方案.

小智 20

我有类似的情况,我必须在购买的应用程序之间提供接口,这些应用程序正在生产中并被大量不同的系统使用.这个系统在dev,test和prod中都有不同的表名(荒谬......)我的解决方案是在NHibernate配置中为表号留下一个占位符,如下所示:

<class name="MyClass" table="MyTable[tableNumber]">
Run Code Online (Sandbox Code Playgroud)

然后实现INamingStrategy类似于:

public class MyCustomNamingStrategy : INamingStrategy
{
    public string ClassToTableName(string className)
    {
        return DefaultNamingStrategy.Instance.ClassToTableName(className);
    }

    public string PropertyToColumnName(string propertyName)
    {
        return DefaultNamingStrategy.Instance.PropertyToColumnName(propertyName);
    }

    public string TableName(string tableName)
    {
        tableName = tableName.Replace("[tableNumber]", LocalSettings.TableNumber);
        return DefaultNamingStrategy.Instance.TableName(tableName);
    }

    public string ColumnName(string columnName)
    {
        return DefaultNamingStrategy.Instance.ColumnName(columnName);
    }

    public string PropertyToTableName(string className, string propertyName)
    {
        return DefaultNamingStrategy.Instance.PropertyToTableName(className, propertyName);
    }

    public string LogicalColumnName(string columnName, string propertyName)
    {
        return DefaultNamingStrategy.Instance.LogicalColumnName(columnName, propertyName);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在配置中设置命名策略:

myConfiguration.SetNamingStrategy(new MyCustomNamingStrategy());
Run Code Online (Sandbox Code Playgroud)

这样,表号可以存储在App.config中,只需更改App.config中的值即可跨环境移动应用程序.我相信你可以找到一种方法来使用它来将表名更改为你需要的任何日期......