1

Я только что создал проект ASP.NET MVC 4 & WebAPI. После этого я добавил .edmx источник данных для проекта.Entity Framework: несколько БД, имеющих одну и ту же схему

У меня есть несколько баз данных с той же схемой. Динамически я хочу заменить строку соединения, используя конструктор по умолчанию, предоставленный в EF.

Но в Model1.Designer.cs каждый раз, когда я получаю ошибку, как «Участник с той же подписью уже объявлен».

Я не могу решить эту проблему.

+1

Разве VS не создает контекст с конструктором, который принимает строковый параметр? –

ответ

2

Да, это работает! Все, что вам нужно изменить, это connection string.

И я только что протестировал его, чтобы удовлетворить свое любопытство.

Вот шаги, которые я взял:
1. Возьмите existing database и create a model для него.
2. Создайте новую пустую базу данных.
3. В SQL Management Studio щелкните правой кнопкой мыши по первой базе данных -> Задачи ->Export Data. Экспортируйте все его данные во вновь созданную базу данных.
4. Удалите некоторые записи из второй базы данных.
5. Напишите этот код:

TMS_MiscEntities db = new TMS_MiscEntities(); 
    TMS_MiscEntities dbCopy = new TMS_MiscEntities(); 
    dbCopy.Database.Connection.ConnectionString = db.Database.Connection.ConnectionString.Replace("initial catalog=TMS_Misc", "initial catalog=TMS_Misc_new"); 

    Response.Write(string.Format("DB 1 records: {0}<br/>", db.ZipCodes.Count())); 
    Response.Write(string.Format("DB 2 records: {0}<br/>", dbCopy.ZipCodes.Count())); 

6. Проверить результаты:

DB 1 records: 869164 
DB 2 records: 868709 

7. Заключить, что он работает :)

Это как моя строка подключения выглядит:

<add name="TMS_MiscEntities" connectionString="metadata=res://*/DbModel.csdl|res://*/DbModel.ssdl|res://*/DbModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=ws2008;initial catalog=TMS_Misc;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
+0

Я обязательно проверю его завтра. если он не работает, я расскажу вам свой сценарий ... спасибо за ответ. – micronyks

+0

Не работает. Я использую EF6. dbCopy.Database.Connection.ConnectionString ..... Я не могу разрешить. База данных. он показывает ошибку там. – micronyks

+0

Какие ошибки? Также вы уверены, что схема базы данных на самом деле одна и та же? Можете ли вы попробовать экспортировать существующую базу данных в новую созданную? –

1

Я использую Entity Framework 6.1.3. Я добавил конструктор в свой DbContext, который принимает строковый параметр. Эта строка может быть именем соединения, хранящегося в вашем App.config, или полной строкой соединения. Что-то вроде этого:

public partial class MyDBContext : DbContext 
{ 
    public MyDBContext(string connectionString) 
     : base(connectionString) 
    { 
    } 

    // DbSets, OnModelCreating, etc 
} 

В моем случае, я управляю применением в многопользовательском и я использую ContextFactory построить правильную строку подключения и вернуть мой инициализированный контекст.

public class ContextFactory 
{ 
    public MyDbContext GetContext() 
    { 
     string connectionString; 
     // do some stuff here 
     return new MyDbContext(connectionString); 
    } 
}