使用 XML 映射向表添加模式前缀 - 需要将 MSSQL 数据库转换为 MySQL

Posted

技术标签:

【中文标题】使用 XML 映射向表添加模式前缀 - 需要将 MSSQL 数据库转换为 MySQL【英文标题】:Adding a Schema Prefix to a Table using XML Mapping - needed to convert a MSSQL Database to a MySQL 【发布时间】:2020-05-08 21:26:24 【问题描述】:

我有 NHibernate XML 映射文件,它们在 MSSQL 数据库中运行良好。一个表格的例子是:

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

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

我尝试过使用

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

通过将自定义命名策略类添加到“配置”中。现在我的自定义类什么都不做:只是抛出 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();
        
    

原因有两个:

    我从未到达 MyCustomNamingStrategy 的断点 开始上课,所以我什至不知道这是否是要走的路。 它会给我有关“模式”的任何信息吗?一世 不知道…… 调用工具SchemaUpdate的代码完全忽略了自定义命名策略,抛出了MySQL Exception 声明没有找到“dbo”数据库(duh....)

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

保持完全相同的 XML 映射文件,但 生成以模式名称为前缀的表?

任何提示将不胜感激!

【问题讨论】:

好吧,我刚刚意识到我犯了一个错误。在加载了所有 *.hbm.xml 文件后,我正在调用我的 _config.SetNamingStrategy(MyCustomNamingStrategy.Instance); 命令。现在,我首先调用自定义命名策略命令并然后 加载文件。这样,我的策略运行得很好。但是,我看不到有关“模式”表的任何信息,以便将“模式表名”转换为“表名”映射(用于 MySQL 目的)。有人有什么想法吗? 【参考方案1】:

终于找到了解决办法:

    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;
        
    

【讨论】:

以上是关于使用 XML 映射向表添加模式前缀 - 需要将 MSSQL 数据库转换为 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

JPA 2 向表添加引用约束使标准查询与延迟获取复杂化,需要建议

将前缀放在 xml 文档的所有元素上

如何使用 XDocument 添加 xml 前缀?

使用 XElement 创建带前缀的 XML 元素

Excel 到 XML 命名空间前缀自定义

使用 Data.plist 时向表中添加披露按钮