कमांड इंटरसेप्टर के साथ समाधान
यह निश्चित रूप से संभव है, हालांकि यह थोड़ा सा हैक है। आप कमांड इंटरसेप्टर के साथ CREATE DATABASE कमांड को बदल सकते हैं। 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) { }
}
टिप्पणियां
चूंकि डेटाबेस शुरू से ही सही संयोजन के साथ बनाया गया है, सभी कॉलम स्वचालित रूप से उस संयोजन को प्राप्त कर लेंगे और आपको बाद में उन्हें बदलना नहीं पड़ेगा।
ध्यान रखें कि यह एप्लिकेशन डोमेन के अंदर होने वाले किसी भी बाद के डेटाबेस निर्माण को प्रभावित करेगा। इसलिए हो सकता है कि आप डेटाबेस बनने के बाद इंटरसेप्टर को हटाना चाहें।