使用 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();
}
}
原因有二:
- 我从未到达我的 MyCustomNamingStrategy 的断点
class 首先,所以我什至不知道这是否可行。
它会给我关于 'schema' 的任何信息吗?我
不知道...
- 调用工具SchemaUpdate的代码完全忽略了自定义命名策略并抛出MySQL异常
声明未找到 'dbo' 数据库(呃....)
在尝试了所有方法并到处搜索之后,我向您寻求帮助。
谁能帮帮我
- 保持完全相同的 XML 映射文件,但
- 生成 table 以其架构名称为前缀?
如有任何提示,我们将不胜感激!
终于找到解决办法:
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;
}
}
我有 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();
}
}
原因有二:
- 我从未到达我的 MyCustomNamingStrategy 的断点 class 首先,所以我什至不知道这是否可行。 它会给我关于 'schema' 的任何信息吗?我 不知道...
- 调用工具SchemaUpdate的代码完全忽略了自定义命名策略并抛出MySQL异常 声明未找到 'dbo' 数据库(呃....)
在尝试了所有方法并到处搜索之后,我向您寻求帮助。 谁能帮帮我
- 保持完全相同的 XML 映射文件,但
- 生成 table 以其架构名称为前缀?
如有任何提示,我们将不胜感激!
终于找到解决办法:
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;
}
}