Как использовать строку подключения SQL с ADO.NET Entity Data Model - PullRequest
5 голосов
/ 03 марта 2011

Я пытаюсь использовать ADO.NET Entity Data Model так, чтобы я мог на лету изменить, какую базу данных я тоже указываю. Изменение баз данных может потребовать совершенно новую строку подключения. Некоторые базы данных находятся на разных серверах. Поэтому мне нужна возможность передать моей модели данных объекта ADO.NET пользовательскую строку подключения, отформатированную следующим образом: 'server = severaddress; database = database1; ID пользователя = test; Password = test1234;'

Отредактировано: мой класс сущностей реализует ObjectContext. Три конструктора, которые я могу использовать - это значение по умолчанию, передать в ConnectionString, передать в EntityConnection. Всякий раз, когда я использую конструкторы перегрузки, я получаю сообщения о том, что он не распознает «сервер» в строке подключения.

Мне нужно создать экземпляр моего хранилища с помощью пользовательской строки подключения или установить его перед использованием.

Ответы [ 5 ]

7 голосов
/ 03 марта 2011

ObjectContext принимает строку соединения сущности в своем конструкторе. Строка подключения объекта состоит из трех частей:

  • Расположение метаданных (местоположение отображаемых XML-файлов, созданных файлом EDMX)
  • Поставщик хранилищ данных
  • Строка подключения к хранилищу данных (это то, что вы хотите предоставить)

У вас есть несколько способов достичь того, что вы хотите. Обычно вам нужно объединить две части строки подключения:

string format = "metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=\"{0}\"";
string connectionString = "server=severaddress;database=database1;UserID=test;Password=test1234;"

var context = ModelContext(String.Format(format, connectionString));

Формат описывает расположение метаданных из Model.edmx, включенного в качестве ресурсов в сборку и поставщика Sql. Вторая часть - это ваша строка подключения.

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

3 голосов
/ 03 марта 2011

Я делал это раньше, просто передав строку подключения в один из перегруженных конструкторов автоматически сгенерированного производного класса DbContext.

3 голосов
/ 03 марта 2011

Контексты сущностей имеют конструкторы, которые принимают строку соединения в качестве аргумента.Я полагаю, что вы можете указать либо саму строку, либо имя строки из вашего элемента connectionStrings в ваших файлах конфигурации.

Так что хитрость заключается в том, чтобы избежать создания ваших контекстов, просто сказав new EntityContext().Один простой способ сделать это - использовать фабрику.

public class ContextFactory : IContextFactory
{
    public EntityContext Get()
    {
        var connectionString = ... // Do some logic to get the connection string
        return new EntityContext(connectionString);
    }
}

...

using (var context = new ContextFactory().Get())
{
    ...
}

Идеальный способ использовать это в сочетании с внедрением зависимостей, чтобы вы даже не были тесно связаны с реализацией new ContextFactory():

public class MyRepository : IMyRepository
{
    private readonly IContextFactory _contextFactory;
    public MyRepository(IContextFactory contextFactory)
    {
        _contextFactory = contextFactory;
    }
    public GetObjects()
    {
        using(var context = _contextFactory.Get())
        {
        }
    }
}

Это дает вам максимальную гибкость при решении вопроса о том, как будут создаваться ваши контексты.

0 голосов
/ 21 октября 2014

Для передачи строки соединения в производный класс ObjectContext я нашел решение по следующей ссылке:

http://blogs.msdn.com/b/rickandy/archive/2008/12/09/explicit-connection-string-for-ef.aspx

0 голосов
/ 02 июля 2012

Попробуйте:

В файле web.confige создайте копию существующей строки подключения и присвойте ей другое имя.Измените атрибуты строки подключения для этой новой строки подключения.Например, если ранее у вас была строка подключения, объявленная как

   <add name="MyEntities" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MySQL1;initial catalog=MyDB;user id=sa;password=password123;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

, добавьте еще одну, присвоив ей новое имя

<add name="MyEntities2" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MySQL2;initial catalog=MyDB;user id=sa;password=password987;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

. Затем в файлах кода добавьте «using System.Data.EntityClient;»Пространство имен.Объявите объект entityConnection и назначьте сервер по умолчанию.

EntityConnection econn = new EntityConnection("name=MyEntities");

Вы можете получить доступ к базе данных по умолчанию, используя следующий код

using (var _context = new MyEntities(econn))
        { .......}

Позже в коде вы можете переключаться между серверами, используя следующиекод:

econn = new EntityConnection("name=MyEntities2");

Вы можете получить доступ ко второй БД, используя следующий код

using (var _context = new MyEntities(econn))  <== This will point to second server now.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...