使用 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的主要内容,如果未能解决你的问题,请参考以下文章