使用 XML 映射将架构前缀添加到 Table - 需要将 MSSQL 数据库转换为 MySQL

Adding a Schema Prefix to a Table using XML Mapping - needed to convert a MSSQL Database to a MySQL

我有 NHibernate XML 映射文件,它们在 MSSQL 数据库中工作得很好。 table 的一个例子是:

<class name="Worm" table="`Worms`" schema="`dbo`">

现在我需要使用完全相同的映射文件(未更改)来生成 MariaDB(或 MySQL)数据库。显然,此类数据库没有模式。所以,我想做的是创建一个命名约定,以便 'schema' 成为 table 的前缀,例如'dbo_Worm'。

我试过使用

var schemaUpdate = new NHibernate.Tool.hbm2ddl.SchemaUpdate(configuration);

通过将自定义命名策略 class 添加到 'configuration' 中。现在我的自定义 class 什么都不做:只是抛出 NotImplementedExceptions():

public class MyCustomNamingStrategy : INamingStrategy
    {
        public static MyCustomNamingStrategy Instance => new MyCustomNamingStrategy(); 

        public string ClassToTableName(string className)
        {
            throw new NotImplementedException();
        }

        public string PropertyToColumnName(string propertyName)
        {
            throw new NotImplementedException();
        }

        public string TableName(string tableName)
        {
            throw new NotImplementedException();
        }

        public string ColumnName(string columnName)
        {
            throw new NotImplementedException();
        }

        public string PropertyToTableName(string className, string propertyName)
        {
            throw new NotImplementedException();
        }

        public string LogicalColumnName(string columnName, string propertyName)
        {
            throw new NotImplementedException();
        }
    }

原因有二:

  1. 我从未到达我的 MyCustomNamingStrategy 的断点 class 首先,所以我什至不知道这是否可行。 它会给我关于 'schema' 的任何信息吗?我 不知道...
  2. 调用工具SchemaUpdate的代码完全忽略了自定义命名策略并抛出MySQL异常 声明未找到 'dbo' 数据库(呃....)

在尝试了所有方法并到处搜索之后,我向您寻求帮助。 谁能帮帮我

如有任何提示,我们将不胜感激!

终于找到解决办法:

    public override void RemoveSchemas(NHibernate.Cfg.Configuration configuration)
    {
        foreach (var clsMapping in configuration.ClassMappings)
        {
            clsMapping.Table.Schema = null;
            if ((clsMapping as NHibernate.Mapping.RootClass) != null) (clsMapping as NHibernate.Mapping.RootClass).CacheRegionName = null;

            if (clsMapping.IdentityTable != null)
            {
                clsMapping.IdentityTable.Schema = null;
                var identifier = clsMapping.IdentityTable.IdentifierValue as NHibernate.Mapping.SimpleValue;
                if (identifier != null)
                {
                    if(identifier?.IdentifierGeneratorProperties?.ContainsKey("schema") == true)
                    {
                        identifier.IdentifierGeneratorProperties["schema"] = null;
                    }
                }
            }
        }

        foreach (var colMapping in configuration.CollectionMappings)
        {
            colMapping.Table.Schema = null;
            if (colMapping.CollectionTable != null) colMapping.CollectionTable.Schema = null;
            colMapping.CacheRegionName = null;
        }
    }