Подтвердить что ты не робот

Настройка Entity Framework для динамической строки подключения

Я работаю над приложением, которое будет использовать одну и ту же схему базы данных для нескольких баз данных. По этой причине я создал базу данных под названием MyTemplate. Когда новый пользователь будет создан, у них будет свой собственный экземпляр базы данных. Таким образом, будет создана база данных, называемая MyTemplate_[UserName]. Когда пользователь входит в систему, мне нужно указать их запросы в свою базу данных. По этой причине я знаю, что мне нужно установить строку подключения во время выполнения. Моя проблема заключается в том, что я также хочу использовать Entity Framework.

В настоящее время я создал новый .edmx, используя MyTemplate в качестве источника. Я думал, что смогу обновить код и установить там строку подключения. К сожалению, я не могу понять, как его установить. Конструктор для TemplateEntities не имеет перегрузки, которая позволяет мне передать строку соединения. Я заметил, что TemplateEntities, полученный из DbContext, я не думаю, что это будет проблемой.

string connectionString = GetUsersConnectionString();
using (TemplateEntities entities = new TemplateEntities())
{
  TemplateEntity entity = new TemplateEntity();

  // Save to the database
  entities.TemplateEntity.Add(entity);
  entities.SaveChanges();
}

Я неправильно создаю .edmx? Или я чего-то не хватает? Все, что я вижу в Google, представляет собой перегрузку, которая должна допускать передачу строки соединения. Однако у меня нет этой перегрузки.

4b9b3361

Ответ 1

Сгенерированный класс TemplateEntities помечен как partial.

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

partial class TemplateEntities
{
  public TemplateEntities( string nameOrConnectionString )
    : base( nameOrConnectionString )
  {
  }
}

Затем передайте строку соединения этому конструктору.

Вы хотите поместить этот код в другой файл, чтобы он не переписывался при обновлении модели edmx.

Ответ 2

Ответ Николаса Батлера вполне правильный. В дополнение к тому, что он сказал, я столкнулся с проблемой принятия существующей строки подключения для инфраструктуры сущностей и просто указания ее на другую базу данных, имеющую ту же структуру. Я использовал следующий код для изменения только источника данных существующей строки:

var originalConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["CSName"].ConnectionString;
var ecsBuilder = new EntityConnectionStringBuilder(originalConnectionString);
var sqlCsBuilder = new SqlConnectionStringBuilder(ecsBuilder.ProviderConnectionString)
{
    DataSource = "newDBHost"
};
var providerConnectionString = sqlCsBuilder.ToString();
ecsBuilder.ProviderConnectionString = providerConnectionString;

string contextConnectionString = ecsBuilder.ToString();
using (var db = new SMSContext(contextConnectionString))
{
    ...
}