Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Définir le classement de la base de données dans Entity Framework Code-First Initializer

Solution avec un intercepteur de commandes

C'est certainement possible, même si c'est un peu un hack. Vous pouvez modifier la commande CREATE DATABASE avec un intercepteur de commande. Il interceptera toutes les commandes envoyées à la base de données, reconnaîtra la commande de création de base de données basée sur une expression regex et modifiera le texte de la commande avec votre classement.

Avant la création de la base de données

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

L'intercepteur

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

Remarques

Étant donné que la base de données est créée avec le bon classement dès le départ, toutes les colonnes hériteront automatiquement de ce classement et vous n'aurez pas à les MODIFIER par la suite.

Sachez que cela aura un impact sur toute création ultérieure de base de données se produisant à l'intérieur du domaine d'application. Vous voudrez peut-être supprimer l'intercepteur après la création de la base de données.