2013-12-10 1 views
2

(я редактировал этот вопрос, так что теперь отличается от первоначального вопроса.)Как переключаться между несколькими, теми же схемами, базами данных в моей .edmx EF-модели?

У меня есть разные, но это же схемы, базы данных. Я смоделировал эту схему с помощью модели .edmx Entity Framework в своем приложении

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

Теперь я хотел бы переключаться между этими различными базами данных во время выполнения. Предпочтительно простым способом. Как именно я это делаю?

Поэтапный учебник или точный, содержащий все примеры кода.

Ниже приведен пример того, как мои строки соединения выглядит в Web.config:

<add name="MyModelEntities" connectionString="metadata=res://*/Dal.ToolA.ToolATestOne.csdl|res://*/Dal.ToolA.ToolATestOne.ssdl|res://*/Dal.ToolA.ToolATestOne.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=MyServer\MySqlServer;initial catalog=MyDatabase;user id=MyUser;password=MyPassword;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

ответ

0

Спасибо за ваш ответ. Извините за мою неясность в вопросе.

Теперь я понял, как это сделать. Я нашел эти две отличные ссылки.

http://mosesofegypt.net/post/Multiple-database-support-with-Entity-Framework.aspx

http://bestplayah.com/entity-framework-dynamic-schema-changes-using-database-first-approach/

Так что я делаю конструктор, который принимает строку соединения, в качестве частичного класса с тем же именем.

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

И затем я динамически генерирую строку подключения к различным базам данных. Таким образом, я могу переключать время работы базы данных :)

+0

Ваши ссылки мертвы. Noooo! – Bruno

2

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

Как так:

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

public static class StaticVariables 
{ 
    public static string ConnectionString { get; set; } 
} 

Для вашего DbContext конструктора:

public DbContext() 
{ 
    this(StaticVariables.ConnectionString); 
} 
+0

Я добавил некоторые Редактирование текста в нижней части моего вопроса. Базы данных моей страны не всегда одинаковы. EF смоделировал мои SPROC и сущности для разных баз данных стран. Мне сложно понять, достаточно ли изменить строку соединения для переключения между этими разными EF-моделями. – RuneHansen

+0

Спасибо за ваш ответ IronMan, я вставил пример моей строки подключения в нижней части моего вопроса выше. Я немного не уверен в том, какие именно части строки подключения? Какая часть кода выше - моя строка подключения? – RuneHansen

+0

Ссылка на пример кода также будет приветствоваться :) – RuneHansen

0

Вы можете использовать что-то, как показано ниже, чтобы изменить строку подключения http://tutorials.csharp-online.net/Connect_Data_ADO_NET%E2%80%94Change_Database_Open_Connection

Если вы хотите переключить DB, используйте метод как

EntityInstance_ReviewEntities.GetContext(GetConnectionString(country)); 

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

+0

Я добавил некоторые Редактировать текст в нижней части моего вопроса. Базы данных моей страны не всегда одинаковы. EF смоделировал мои SPROC и сущности для разных баз данных стран. Мне сложно понять, достаточно ли изменить строку соединения для переключения между этими разными EF-моделями. – RuneHansen

+0

Да, измените строку подключения, а затем получите новый контекст. Метод, который я вам дал выше, достаточно, чтобы получить новый контекст. – Satii

+0

У меня, похоже, нет доступа к методу GetContext() в моем коде. Есть ли хороший учебник с примером кода? – RuneHansen

4

Класс DbContext имеет параметр конструктора nameOrConnectionString. В зависимости от того, как вы инициализируете свой DbContext, вы можете передать другое имя строки подключения. Если вы, например, хранить их на название страны, как:

<connectionStrings> 
    <add name="YourApplication_UK" connectionString="..."/> 
    <add name="YourApplication_Norway" connectionString="..."/> 
    <add name="YourApplication_Sweden" connectionString="..."/> 
</connectionStrings> 

Тогда из кода, можно построить соответствующее имя строки соединения:

string connectionStringName = "YourApplication_" + myApplicationLocation; 
var dbContext = new DbContext(connectionStringName); 
+0

Я добавил некоторые Редактировать текст в нижней части моего вопроса. Базы данных моей страны не всегда одинаковы. EF смоделировал мои SPROC и сущности для разных баз данных стран. Мне сложно понять, достаточно ли изменить строку соединения для переключения между этими разными EF-моделями. – RuneHansen

+0

Спасибо CodeCaster, но ... Когда я пишу var dbContext = new DbContext (connectionStringName); Я не могу получить доступ к своим SPROCs dbContext.sprocMySproc() Когда я пишу var entityFramework = new MyDatabaseNameEntities(); Мои объекты не имеют метода с параметром. Есть ли пример кода для того, что вы предлагаете? – RuneHansen

+0

«var dbContext = ...» должен, конечно, инициализировать ваш конкретный контекст, поэтому «var dbContext = MyDatabaseNameEntities (connectionStringName)». Возможно, вам придется создать новый конструктор в 'MyDatabaseNameEntities', принимающий строку, и вызов': base (connectionStringName) '. – CodeCaster

Смежные вопросы