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

Изменить имя db в строке подключения во время выполнения в Entity Framework

В моем проекте я хочу запустить некоторые модульные тесты на уровне DAL, который использует EntityFramework. Я создаю из скриптов новую базу данных перед каждым запуском тестов (чтобы всегда иметь одинаковые исходные данные при выполнении тестов). В конце тестов эта база данных удаляется (все делается автоматически с помощью атрибутов [ClassInitialize()] и [ClassCleanup()]. ​​

Сгенерированная база данных всегда имеет другое имя, например TestDB-2009-01-31--12-00-00, чтобы не противоречить тестовым базам данных моих коллег.

Фактическая проблема, которая у меня есть, заключается в том, что я еще не нашел способ сообщить EntityFramework подключиться к сгенерированной базе данных (имя создается во время выполнения). Прямо сейчас он подключается к строке подключения, указанной в файле app.config, что естественно, конечно. И поскольку я делаю эти тесты, я ищу что-то, что можно сделать из-за DAL dll (без настройки чего-либо непосредственно в контексте EF).

Любая помощь очень ценится.

Спасибо.

4b9b3361

Ответ 1

При создании ObjectContext вам нужно будет использовать перегрузку конструктора, которая принимает параметр ConnectionString в качестве параметра.

Вы можете построить эту ConnectionString с помощью EntityConnectionStringBuilder. Более конкретно, если ваша базовая база данных - это SQL Server, вы можете использовать SqlConnectionStringBuilder для создания значения для EntityConnectionStringBuilder.ProviderConnectionString.

Вот какой код, который строит строку подключения SQL Server

var scsb = new SqlConnectionStringBuilder();
scsb.DataSource = "localhost";
scsb.InitialCatalog = "MyDB";
scsb.IntegratedSecurity = true;

И вот какой-то код, который строит Entity ConnectionString:

var builder = new EntityConnectionStringBuilder();
builder.Metadata = "res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl";
builder.Provider = "System.Data.SqlClient";
builder.ProviderConnectionString = scsb.ConnectionString;