Задать вопрос

Как организовать выбор базы данных при использовании Entity Framework?

Пишу приложение на C# с использованием Entity Framework. Есть несколько баз данных с идентичной структурой таблиц и при запуске приложения необходимо запрашивать у пользователя к какой базе он хочет подключиться. Не могу найти способа как организовать подобное, т.к. при создании модели *.edmx через мастер, у меня формируется совершенно определенный connection string. Можно конечно сделать для каждой БД свою модель, но возможно есть способ на основании одной модели организовать подключение к выбранной пользователем БД?

Использую:
Visual studio 2013
Entity Framework 6.0
MS SQL Server 2008
  • Вопрос задан
  • 6092 просмотра
Подписаться 5 Оценить Комментировать
Решения вопроса 2
@CrackedSapphire
Есть метод ChangeDatabase

Тыц

из уже живого DB context'a можно добраться:
context.Database.Connection.ChangeDatabase(databaseName);
Ответ написан
@BladeRuner Автор вопроса
Нашел интересное решение своей проблемы. Спешу поделиться мини-туториалом.

1. Открываем файл [имя модели].Context.cs и находим там следующий код:
public partial class MainDataModel : DbContext
{
    public MainDataModel()
        : base("name=MainDataModel")
    {
    }
...

2. После основного конструктора добавляем свой:
public MainDataModel(string databaseName)
{
    Database.Connection.ConnectionString = @"Data Source=MySQLServer;Initial Catalog=" + databaseName + ";Integrated Security=True"; 
}

3. Теперь можно создавать контексты в таком виде:
using (var context = new MainDataModel("MyFirstDatabase"))
{
  ...
}

using (var context = new MainDataModel("MySecondDatabase"))
{
  ...
}


Надо сказать, что это решение попахивает каким-то грязным хаком и надругательством над EF, но других вариантов я пока не нашел.

UPD:
Любое изменение модели приведет к перезаписи файла [имя модели].Context.cs, поэтому лучше вынести это все в код формы или во вспомогательный класс.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
Кто мешает вынести строку подсоединения во внешнюю конфигурацию и выбирать при запуске, как это делается в 1C, например?
Ответ написан
artzub
@artzub
Программист
Ответ на вопрос в предыдущем комментарии.
private static void InitConnectSetting() {
	Configuration config = ConfigurationManager.
		OpenExeConfiguration(ConfigurationUserLevel.None);

	var path = DebugMode ? DebugModeDbPath() : Application.StartupPath;
	
	Dictionary<string, string> db = new Dictionary<string, string>() {
		{"ec", string.Format("{0}\\db\\{1}", path, /*DebugMode ? "data.db" : */"data.db")},
	};

	var conSets = config.ConnectionStrings;

	foreach (var key in db.Keys) {
		var sName = key + "Entities";
		var conSet = conSets.ConnectionStrings[sName];
		if (conSet != null)
			conSets.ConnectionStrings.Remove(conSet);
		conSet = new ConnectionStringSettings();
		conSet.ProviderName = "System.Data.EntityClient";
		conSet.Name = sName;				
		conSet.ConnectionString = 
			string.Format("metadata=res://*/{0}Model.csdl|res://*/{0}Model.ssdl|res://*/{0}Model.msl;" + 
				"provider=System.Data.SQLite;" +
				"provider connection string=\"data source={1}\"", key, db[key]);
		conSets.ConnectionStrings.Add(conSet);
		var file = new FileInfo(db[key]);
		if (false && !file.Exists) {
			using (BinaryWriter binWriter =
						new BinaryWriter(File.Open(db[key], FileMode.Create))) {
				switch (key) {
					case "ec":
						binWriter.Write(Properties.Resources.kladr, 0, Properties.Resources.kladr.Length);
						break;							
				}
			}
		}
	}
	conSets.SectionInformation.ForceSave = true;
	conSets.SectionInformation.RequirePermission = false;
	config.Save(ConfigurationSaveMode.Modified);

	ConfigurationManager.RefreshSection(conSets.SectionInformation.Name);
}


UPD: При запуске предлагать выбрать бд а затем изменять строки подключения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы