2

У нас есть веб-приложение ASP.NET MVC, которое работает с Entity Framework. До сих пор все работает довольно хорошо, но теперь мне нужно реализовать функцию, которая позволяет импортировать огромные объемы данных в таблицу архивов.Как получить DataSource, UserID и пароль из Entity ConnectionString?

Данные, необходимые для импорта, представлены в виде файла базы данных SQL Server Compact, который я могу загрузить и обработать через веб-приложение. Моя первая попытка состояла в том, чтобы читать строки и создавать новые объекты для каждой строки, которые я добавил в список этого типа. Затем я использовал метод EF AddRange() для добавления строк в базу данных.

Этот метод не работает из-за проблем с памятью и производительностью даже при небольших импортных файлах. Поэтому я немного поработал в Google и решил пойти на сборку SQL вставки (и тем самым обход EF), что было четко указано как наиболее эффективный способ.

В моей web.config у меня есть строка подключения EF, которая также содержит данные, необходимые для доступа к базе данных. Поскольку мне нужно работать с SqlConnection, мне нужен рабочий SQLProvider ConnectionString. Строка соединения EF не работает в этом случае из-за дополнительных записей, с которыми SqlConnection не работает (что приводит к ошибкам типа «неподдерживаемое ключевое слово: метаданные» и т. Д.).

Так что я хочу построить новую строку соединения SqlConnection с SqlConnectionStringBuilder. Мне нужны только три параметра: UserID, Password и DataSource. Все они присутствуют в строке подключения EF.

Как я могу получить их из моего существующего соединения EF? Я определенно не хочу уродливого разбора/регулярного выражения, но я не мог понять, как получить эти значения.

+0

Я знаю, что это не является частью вопроса, но почему бы не просто добавить new connectionstring в web.config вместо того, чтобы пытаться использовать существующий для создания нового? – Mackan

+0

Вы правы, я мог бы просто добавить еще одну строку соединения, но поскольку требуемые данные уже присутствуют, я бы хотел использовать существующую. – Robert

ответ

3

Вы можете попробовать лить EntityConnection в SqlConnection напрямую. Это также даст вам доступ к необходимой вам информации.

using (var ec = new EntityConnection(connstr.ConnectionString)) 
{ 
    var sqlConn = ec.StoreConnection as SqlConnection; 
    sqlConn.Open(); 

    var dataSource = sqlConn.DataSource; 
    var userId = sqlConn.Credential.UserId; 
    var password = sqlConn.Credential.Password; 
} 
+0

Это именно то, что я искал, большое спасибо! – Robert

1

Несмотря на то, что это старый вопрос, я отправляю ответ, надеясь, что кто-то может найти его полезным.

Принятый ответ не может быть хорошо для кого-то, кто не хочет, чтобы открыть соединение только, чтобы получить свойства, как источник данных, учетные данные пользователя и т.д.

Это так, как я бы об этом:

Web.Config файл:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
    <add name="Genus_Connection_String" connectionString="metadata=res://*/GenusEFModel.csdl|res://*/GenusEFModel.ssdl|res://*/GenusEFModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=D-SQL203;initial catalog=Genus_AIS_TaskDev_SB4;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/> 
    </connectionStrings> 
</configuration> 

код для получения строки соединения:

static void Main(string[] args) 
{ 

    ConnectionStringSettings genusSettings = ConfigurationManager.ConnectionStrings["Genus_Connection_String"]; 
    if (genusSettings == null || string.IsNullOrEmpty(genusSettings.ConnectionString)) 
    { 
     throw new Exception("Fatal error: Missing connection string 'Genus_Connection_String' in web.config file"); 
    } 
    string genusConnectionString = genusSettings.ConnectionString; 
    EntityConnectionStringBuilder entityConnectionStringBuilder = new EntityConnectionStringBuilder(genusConnectionString); 
    SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder(entityConnectionStringBuilder.ProviderConnectionString); 
    string genusSqlServerName = sqlConnectionStringBuilder.DataSource; 
    string genusDatabaseName = sqlConnectionStringBuilder.InitialCatalog; 

    Console.WriteLine("genusSqlServerName = " + genusSqlServerName); 
    Console.WriteLine("genusDatabaseName = " + genusDatabaseName); 
    Console.ReadLine(); 
} 

Если вы были настройки идентификатора пользователя и пароля в строке подключения, вы могли бы получить их, как показано ниже:

string userID = sqlConnectionStringBuilder.UserID; 
string password = sqlConnectionStringBuilder.Password; 
Смежные вопросы