Řešení s příkazovým interceptorem
Určitě je to možné, i když je to trochu hack. Příkaz CREATE DATABASE můžete změnit pomocí zachycovače příkazů. Zachytí všechny příkazy odeslané do databáze, rozpozná příkaz k vytvoření databáze na základě výrazu regulárního výrazu a změní text příkazu s vaším řazením.
Před vytvořením databáze
DbInterception.Add(new CreateDatabaseCollationInterceptor("SQL_Romanian_Cp1250_CI_AS_KI_WI"));
Zachycovač
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) { }
}
Poznámky
Vzhledem k tomu, že databáze je od začátku vytvořena se správným řazením, všechny sloupce toto řazení automaticky zdědí a nemusíte je poté MĚNIT.
Uvědomte si, že to ovlivní jakékoli pozdější vytvoření databáze uvnitř aplikační domény. Takže možná budete chtít odstranit interceptor po vytvoření databáze.