我正在使用带有2个数据库的EF - 使用SQL CE和SQL Server。
有没有办法知道在运行时使用哪种连接类型?我的意思是,如果我在某个地方只有ObjectContext(已经用一些连接字符串初始化),我可以从中获取数据库类型(目前是Compact还是SQL Server)?
由于
答案 0 :(得分:3)
您可以查看Connection Property,其中应返回EntityConnection;从那里你必须检查它的StoreConnection这将是“真正的”数据库连接。
从那里,您可以查看ConnectionString,它会告诉您提供商,或者只是通过is
或GetType
检查提供商连接的类型。如果它是SQL Server,它将是SqlConnection
,如果它是SQL CE,它将是SqlCeConnection
。
这看起来像一个丑陋的黑客,因为它是;如果你正在寻找一种方法来做这个没有一个丑陋的黑客,请不要打扰 - ObjectContext
是明确设计的而不是泄露任何有关的信息连接除非你确切知道要求什么。相比之下,这是你必须通过app config检查它的所有箍:
static string GetProviderName(ObjectContext context)
{
string entityConnectionString = GetEntityConnectionString(context);
return !string.IsNullOrEmpty(entityConnectionString) ?
GetProviderConnectionString(entityConnectionString) : null;
}
static string GetEntityConnectionString(ObjectContext context)
{
var match = Regex.Match(context.Connection.ConnectionString,
@"name=(?<name>[^;]+)", RegexOptions.Compiled);
string connectionStringName = match.Success ?
match.Groups["name"].Value : null;
return ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
}
static string GetProviderConnectionString(string entityConnectionString)
{
var match = Regex.Match(entityConnectionString,
@"provider=(?<provider>[^;]+)", RegexOptions.Compiled);
return match.Success ? match.Groups["provider"].Value : null;
}
一旦任何解决方案开始涉及正则表达式,我倾向于寻找更直的路径,在这种情况下,这就是你说你不想使用的类型转换。选择你的毒药。
小心如何使用上述任何一种方法。 EF4是围绕持久性无知设计的,你应该试图避免任何特定于连接类型的逻辑,因为你真的不知道它将如何配置(也许明天它将是一个Oracle连接) 。我认为特定于提供程序的代码主要位于QueryProvider。