コマンドインターセプターを使用した解決策
少しハックですが、それは間違いなく可能です。コマンドインターセプターを使用して、CREATEDATABASEコマンドを変更できます。 Ilは、データベースに送信されたすべてのコマンドをインターセプトし、正規表現に基づいてデータベース作成コマンドを認識し、照合によってコマンドテキストを変更します。
データベース作成前
DbInterception.Add(new CreateDatabaseCollationInterceptor("SQL_Romanian_Cp1250_CI_AS_KI_WI"));
インターセプター
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) { }
}
備考
データベースは最初から正しい照合で作成されるため、すべての列が自動的にその照合を継承し、後でそれらを変更する必要はありません。
これは、アプリケーションドメイン内で発生する後のデータベース作成に影響を与えることに注意してください。したがって、データベースの作成後にインターセプターを削除することをお勧めします。