sql >> データベース >  >> RDS >> Sqlserver

Entity FrameworkCode-FirstInitializerでデータベース照合を設定します

    コマンドインターセプターを使用した解決策

    少しハックですが、それは間違いなく可能です。コマンドインターセプターを使用して、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) { }
    }
    

    備考

    データベースは最初から正しい照合で作成されるため、すべての列が自動的にその照合を継承し、後でそれらを変更する必要はありません。

    これは、アプリケーションドメイン内で発生する後のデータベース作成に影響を与えることに注意してください。したがって、データベースの作成後にインターセプターを削除することをお勧めします。



    1. Javaマルチキャストの存続時間は常に0です

    2. MongoクラスターをSSLで保護する

    3. SQLite AUTOINCREMENT

    4. sqliteで外部キーを使用する方法は?