Добавление префикса схемы в таблицу с использованием сопоставления XML - необходимо для преобразования базы данных MS SQL в MySQL - PullRequest
0 голосов
/ 22 января 2020

У меня есть файлы сопоставления NHibernate XML, которые прекрасно работают в базах данных MS SQL. Пример таблицы:

<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();
        }
    }

Причины две:

  1. Я никогда не достигал точек останова моего класса MyCustomNamingStrategy, чтобы начать с, так что я даже не знаю, если это путь к go. Это даст мне какую-либо информацию относительно «схемы»? Я не знаю ...
  2. Код, который вызывает SchemaUpdate инструмента, полностью игнорирует пользовательскую стратегию именования, и выдается исключение MySQL, указывающее, что база данных 'dbo' не найдена (да .. ..)

Перепробовав все и обыскав везде, я обращаюсь к вам за помощью. Может ли кто-нибудь помочь мне

  • Сохранить тот же XML Файл отображения, но
  • Создать таблицы с префиксами с именами их схем?

Будем благодарны за любые подсказки!

1 Ответ

0 голосов
/ 31 января 2020

Наконец-то нашли решение:

    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;
        }
    }
...