sql >> Base de Datos >  >> RDS >> Sqlserver

Establecer la intercalación de la base de datos en Entity Framework Code-First Initializer

Solución con interceptor de mando

Definitivamente es posible, aunque es un poco complicado. Puede modificar el comando CREATE DATABASE con un interceptor de comandos. Il interceptará todos los comandos enviados a la base de datos, reconocerá el comando de creación de la base de datos en función de una expresión regular y alterará el texto del comando con su intercalación.

Antes de la creación de la base de datos

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

El interceptor

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) { }
}

Comentarios

Dado que la base de datos se crea con la intercalación correcta desde el principio, todas las columnas heredarán automáticamente esa intercalación y no tendrá que ALTERARLAS después.

Tenga en cuenta que afectará cualquier creación de base de datos posterior que se produzca dentro del dominio de la aplicación. Por lo tanto, es posible que desee eliminar el interceptor después de crear la base de datos.