Sql server 我使用的实体框架是SQL CE还是SQL Server?

Sql server 我使用的实体框架是SQL CE还是SQL Server?,sql-server,entity-framework,sql-server-ce,Sql Server,Entity Framework,Sql Server Ce,我将EF用于两个数据库——SQL CE和SQL Server 有没有办法知道在运行时使用哪种连接类型?我的意思是,如果我在某个地方只有ObjectContext(已经用一些连接字符串初始化),我可以从中获取数据库类型(目前是Compact还是SQL Server) 谢谢您可以查看,它应该返回一个;从那里,您必须检查它的连接,这将是“真正的”数据库连接 从那里,您可以检查,这将告诉您提供程序,或者只需使用is或GetType检查提供程序连接本身的类型。如果是SQL Server,它将是一个SqlC

我将EF用于两个数据库——SQL CE和SQL Server

有没有办法知道在运行时使用哪种连接类型?我的意思是,如果我在某个地方只有ObjectContext(已经用一些连接字符串初始化),我可以从中获取数据库类型(目前是Compact还是SQL Server)

谢谢

您可以查看,它应该返回一个;从那里,您必须检查它的连接,这将是“真正的”数据库连接

从那里,您可以检查,这将告诉您提供程序,或者只需使用
is
GetType
检查提供程序连接本身的类型。如果是SQL Server,它将是一个
SqlConnection
,如果是SQL CE,它将是一个
SqlCeConnection

这看起来像一个丑陋的黑客,因为它是;如果您正在寻找一种方法来做到这一点,而不需要进行难看的黑客攻击,那么不要麻烦,
ObjectContext
的明确设计是为了不泄露任何有关连接的信息,除非您确切知道要问什么。相比之下,以下是通过应用程序配置进行检查所需的所有步骤:

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;
}
静态字符串GetProviderName(ObjectContext上下文)
{
string entityConnectionString=GetEntityConnectionString(上下文);
return!string.IsNullOrEmpty(entityConnectionString)?
GetProviderConnectionString(entityConnectionString):null;
}
静态字符串GetEntityConnectionString(ObjectContext上下文)
{
var match=Regex.match(context.Connection.ConnectionString,
@“name=(?[^;]+)”,RegexOptions.Compiled);
string ConnectionString=match.Success?
match.Groups[“name”]。值:null;
返回ConfigurationManager.ConnectionString[ConnectionString名称].ConnectionString;
}
静态字符串GetProviderConnectionString(字符串entityConnectionString)
{
var match=Regex.match(entityConnectionString,
@“provider=(?[^;]+)”,RegexOptions.Compiled);
返回match.Success?match.Groups[“provider”]。值:null;
}
一旦任何解决方案开始涉及正则表达式,我倾向于寻找一条更直的路径,在这种情况下,这就是您所说的不喜欢使用的类型转换。选择你的毒药

请注意如何使用上述任一方法。EF4是围绕持久性忽略而设计的,您应该尽量避免任何特定于连接类型的逻辑,因为您真的不知道它将如何配置(也许明天它将是Oracle连接)。我相信特定于提供者的代码主要驻留在中。

您可以检查,它应该返回一个;从那里,您必须检查它的连接,这将是“真正的”数据库连接

从那里,您可以检查,这将告诉您提供程序,或者只需使用
is
GetType
检查提供程序连接本身的类型。如果是SQL Server,它将是一个
SqlConnection
,如果是SQL CE,它将是一个
SqlCeConnection

这看起来像一个丑陋的黑客,因为它是;如果您正在寻找一种方法来做到这一点,而不需要进行难看的黑客攻击,那么不要麻烦,
ObjectContext
的明确设计是为了不泄露任何有关连接的信息,除非您确切知道要问什么。相比之下,以下是通过应用程序配置进行检查所需的所有步骤:

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;
}
静态字符串GetProviderName(ObjectContext上下文)
{
string entityConnectionString=GetEntityConnectionString(上下文);
return!string.IsNullOrEmpty(entityConnectionString)?
GetProviderConnectionString(entityConnectionString):null;
}
静态字符串GetEntityConnectionString(ObjectContext上下文)
{
var match=Regex.match(context.Connection.ConnectionString,
@“name=(?[^;]+)”,RegexOptions.Compiled);
string ConnectionString=match.Success?
match.Groups[“name”]。值:null;
返回ConfigurationManager.ConnectionString[ConnectionString名称].ConnectionString;
}
静态字符串GetProviderConnectionString(字符串entityConnectionString)
{
var match=Regex.match(entityConnectionString,
@“provider=(?[^;]+)”,RegexOptions.Compiled);
返回match.Success?match.Groups[“provider”]。值:null;
}
一旦任何解决方案开始涉及正则表达式,我倾向于寻找一条更直的路径,在这种情况下,这就是您所说的不喜欢使用的类型转换。选择你的毒药


请注意如何使用上述任一方法。EF4是围绕持久性忽略而设计的,您应该尽量避免任何特定于连接类型的逻辑,因为您真的不知道它将如何配置(也许明天它将是Oracle连接)。我相信特定于提供者的代码主要存在于。

EF4(或至少其中一个)的要点是抽象这些信息。如果您能够从上下文中推断出正在使用哪个数据库,我强烈建议您不要从中形成任何逻辑?谢谢,我现在就开始讨论这个问题。根据这一点,只有一个超时设置器。我也希望能重做一遍。但我现在需要一点修正:)EF4(或至少其中一个)的要点是抽象这些信息。如果您能够从上下文中推断出正在使用哪个数据库,我强烈建议您不要从中形成任何逻辑?谢谢,我现在就开始讨论这个问题。根据这一点,只有一个超时设置器。我也希望能重做一遍。但我现在需要一个小补丁:)谢谢你的回答和关于持久性无知的提醒-一切都会好起来:)连接字符串没有用-在我的情况下,它只是“name=SomeSpecificName”。我现在使用您的第二个建议,但是
连接
属性的类型是
DbConnection
,我现在将其转换为
EntityConnection
,例如:
((EntityConnection)(Connection))。StoreConnection是SqlCeConnection
。这就是我想要得到的东西