14 августа 2017 г.

Учим Ecm7.Migrator работать с MSSQL типом DATETIME2

Сегодня хотелось бы рассказать зачем мы начали использовать ECM7.Migrator и как его научить понимать DbType.DateTime2 на версии ECM7 2.8.0.0.

Зачем использовать ECM7?


Всю информацию можно узнать на сайте проекта ECM7.Migrator ссылка на NuGet. Тут я опишу почему мы его стали использовать на работе. В решениях используем EntityFramework с Code First подход при работе с базой данных. Для этого EntityFramework умеет создавать, на основе объектной модели, сущности в базе данных. Данные об этих сущностях хранятся в миграциях, а их применением и версионностью занимается DbMigrator. Все было бы хорошо, но есть одно ограничение - все миграции должны находиться в проекте с DbContext. И в ситуации, если решение состоит из плагинов, каждому из которых требуется своя структура в базе, это ограничение требует, что бы все миграции до подключения плагина уже были применены к базе. Но в этом случае теряется смысл в выделении модулей и подключении только нужных.

Для решения мы использовали ECM7.Migrator, на который пришлось переписать создание базы данных решения, а модульные миграции без проблем перенесли в другие сборки.

Работа с DateTime2.


Решения из коробки у версии ECM7 2.8.0.0, для работы с типом DateTime2, найдено не было, но это лечится простым добавлением типа в карту типов SqlServerTransformationProvider.


using System.Data;
using System.Data.SqlClient;
 
namespace ECM7.Migrator.Providers.SqlServer
{
    /// <summary>
    /// Extended <see cref="SqlServerTransformationProvider"/> MSSQL provider.
    /// </summary>
    internal class ExtendedSqlServerTransformationProvider : SqlServerTransformationProvider
    {
        /// <summary>
        /// <see cref="ExtendedSqlServerTransformationProvider"/> constructor.
        /// </summary>
        public ExtendedSqlServerTransformationProvider(SqlConnection connection, int commandTimeout)
            : base(connection, commandTimeout)
        {
            typeMap.Put(DbType.DateTime2, "DATETIME2");
        }
    }
}
 

Комментариев нет:

Отправить комментарий