Giải pháp với bộ đánh chặn lệnh
Nó chắc chắn là có thể, mặc dù nó có một chút hack. Bạn có thể thay đổi lệnh TẠO CƠ SỞ DỮ LIỆU bằng một bộ chặn lệnh. Il sẽ chặn tất cả các lệnh được gửi đến cơ sở dữ liệu, nhận dạng lệnh tạo cơ sở dữ liệu dựa trên biểu thức regex và thay đổi văn bản lệnh với đối chiếu của bạn.
Trước khi tạo cơ sở dữ liệu
DbInterception.Add(new CreateDatabaseCollationInterceptor("SQL_Romanian_Cp1250_CI_AS_KI_WI"));
Máy đánh chặn
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) { }
}
Nhận xét
Vì cơ sở dữ liệu được tạo với đối chiếu phù hợp ngay từ đầu, nên tất cả các cột sẽ tự động kế thừa đối chiếu đó và bạn sẽ không phải thay đổi chúng sau đó.
Hãy lưu ý rằng nó sẽ ảnh hưởng đến bất kỳ quá trình tạo cơ sở dữ liệu nào sau này xảy ra bên trong miền ứng dụng. Vì vậy, bạn có thể muốn loại bỏ trình đánh chặn sau khi cơ sở dữ liệu được tạo.