Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Impostare le regole di confronto del database in Entity Framework Code-First Initializer

Soluzione con un intercettore di comandi

È sicuramente possibile, anche se è un po' un trucco. È possibile modificare il comando CREATE DATABASE con un intercettatore di comandi. Intercetterà tutti i comandi inviati al database, riconoscerà il comando di creazione del database in base a un'espressione regolare e modificherà il testo del comando con le tue regole di confronto.

Prima della creazione del database

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

L'intercettore

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

Osservazioni

Poiché il database viene creato con le regole di confronto corrette dall'inizio, tutte le colonne erediteranno automaticamente quelle regole di confronto e non dovrai modificarle in seguito.

Tieni presente che influirà sulla successiva creazione di database che si verificherà all'interno del dominio dell'applicazione. Quindi potresti voler rimuovere l'intercettore dopo aver creato il database.