Вы можете проверить Свойство соединения , которое должно возвращать EntityConnection ; оттуда вы должны проверить его StoreConnection , который будет "реальным" соединением с базой данных.
Оттуда вы можете либо проверить ConnectionString , которая сообщит вам провайдера, либо просто проверить тип самого соединения провайдера с помощью 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;
}
Как только любое решение начинает включать регулярные выражения, я стремлюсь найти более прямой путь, и в этом случае это тип приведения типов, который, по вашему мнению, вы бы предпочли не использовать. Выбери свой яд.
Будьте осторожны при использовании любого из вышеперечисленных подходов. EF4 разработан на основе невежественности постоянства , и вы должны стараться избегать любой логики, специфичной для типа соединения, потому что вы действительно не представляете, как он будет настроен (возможно, завтра это будет соединение Oracle). Я считаю, что специфичный для провайдера код находится в основном в QueryProvider .