Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Definir agrupamento de banco de dados no Entity Framework Code-First Initializer

Solução com interceptor de comando


É definitivamente possível, embora seja um pouco hack. Você pode alterar o comando CREATE DATABASE com um interceptor de comando. Il interceptará todos os comandos enviados ao banco de dados, reconhecerá o comando de criação do banco de dados com base em uma expressão regex e alterará o texto do comando com seu agrupamento.

Antes da criação do banco de dados

DbInterception.Add(new CreateDatabaseCollationInterceptor("SQL_Romanian_Cp1250_CI_AS_KI_WI"));

O interceptador

public class CreateDatabaseCollationInterceptor : IDbCommandInterceptor
{
    private readonly string _collation;

    public CreateDatabaseCollationInterceptor(string collation)
    {
        _collation = collation;
    }

    public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) { }
    public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
    {
        // Works for SQL Server
        if (Regex.IsMatch(command.CommandText, @"^create database \[.*]$"))
        {
            command.CommandText += " COLLATE " + _collation;
        }
    }
    public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { }
    public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext) { }
    public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { }
    public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext) { }
}

Observações


Como o banco de dados é criado com o agrupamento correto desde o início, todas as colunas herdarão automaticamente esse agrupamento e você não precisará alterá-las posteriormente.

Esteja ciente de que isso afetará qualquer criação posterior de banco de dados que ocorra dentro do domínio do aplicativo. Portanto, você pode querer remover o interceptor depois que o banco de dados for criado.