Извлечь строку подключения из строки Entity Connection
При создании и подключении Entity Connection String вы получаете что-то вроде
<add name="MREntities" connectionString="metadata=res://*/App_Code.MembershipAndRoll.MembershipAndRollEntities.csdl|res://*/App_Code.MembershipAndRoll.MembershipAndRollEntities.ssdl|res://*/App_Code.MembershipAndRoll.MembershipAndRollEntities.msl;provider=MySql.Data.MySqlClient;provider connection string="server=192.168.0.26;User Id=digitaliv;password=*******;Persist Security Info=True;database=digitaliv"" providerName="System.Data.EntityClient" />
Мой вопрос заключается в том, как вы берете истинную внутреннюю строку соединения из этого вызова, чтобы вызвать ручное соединение sql для вызова хранимых процедур, пользовательских операторов sql и т.д.? В частности, мне нужна эта часть, извлеченная из него
server=192.168.0.26;User Id=digitaliv;password=*******;Persist Security Info=True;database=digitaliv
Ответы
Ответ 1
Предполагая, что у вас есть экземпляр ObjectContext
(если вы используете встроенный конструктор, ваш контекст происходит из класса EF ObjectContext
). Вы можете передать значение свойства ObjectContext.Connection
(которое является DbConnection) на EntityConnection
.
Класс EntityConnection
имеет свойство StoreConnection
, которое является фактическим DbConnection
, используемым для подключения к базе данных. На самом деле это свойство ConnectionString
установлено на тот, который вы ищете.
Изменить: некоторый пример кода (назначить контекст для объекта ObjectContext):
ObjectContext context = entities;
EntityConnection entityConnection = context.Connection as EntityConnection;
if (null != entityConnection)
{
Console.WriteLine(entityConnection.StoreConnection.ConnectionString);
}
Ответ 2
В то время как Ян Ремунда справедливо указывает, что вам не нужно создавать контекст, и хотя его решение полезно, если вы хотите явно создать соединение сразу после чтения строки подключения EntityClient
, оно все еще немного запутано, если все, что вам нужно, - это получить строку подключения внутреннего поставщика (что и спрашивает OP).
Верно, что вам не нужно открывать соединение, вы можете просто получить ConnectionString
внутреннего StoreConnection
, а затем отбросить его сразу после, но почему?
Вместо этого используйте соответствующий построитель строк:
new EntityConnectionStringBuilder(outerConnectionString).ProviderConnectionString
См. EntityConnectionStringBuilder.
Ответ 3
Вам не нужно создавать экземпляр объекта ObjectContext. Потому что в этом случае вы должны ссылаться на сборки, где хранятся метаданные, а для производительности тоже не очень хорошо.
Существует более простой способ получить строку подключения поставщика в свойстве StoreConnection.
using (var ec = new EntityConnection(connstr.ConnectionString))
{
var sqlConn = ec.StoreConnection as SqlConnection;
sqlConn.Open();
}
Ответ 4
Мы можем использовать следующий код для извлечения строки подключения только из строки подключения сущности без метаданных.
string connectionString = new MREntities().Database.Connection.ConnectionString
Ответ 5
попробуйте следующее:
conn = ConfigurationManager.ConnectionStrings["MREntities"].ConnectionString;