/ / zmień nazwę db w parametrze połączenia w czasie wykonywania w Entity Framework - .net, encja-środowisko, środowisko wykonawcze

zmienić nazwę bazy danych w łańcuchu połączenia w środowisku wykonawczym w Entity Framework - .net, entity-framework, runtime

W moim projekcie chcę przeprowadzić testy jednostkowewarstwa DAL korzystająca z EntityFramework. Tworzę z zera nową bazę danych przed każdym uruchomieniem testów (aby mieć zawsze te same dane początkowe podczas wykonywania testów). Na koniec testów ta baza danych jest usuwana (wszystko odbywa się automatycznie przy użyciu pomoc atrybutów [ClassInitialize ()] i [ClassCleanup ()].

Wygenerowana baza danych zawsze ma inną nazwę, na przykład TestDB-2009-01-31--12-00-00, aby nie kolidować z testowymi bazami danych moich kolegów.

Rzeczywisty problem, jaki mam, polega na tym, że nieznaleźć jeszcze sposób, aby powiedzieć EntityFramework, aby połączyć się z wygenerowaną bazą danych (nazwa jest generowana w czasie wykonywania). W tej chwili łączy się z ciągiem połączenia określonym w pliku app.config, co oczywiście jest normalne. A ponieważ robię te testy, szukam czegoś, co można zrobić spoza biblioteki DLL DAL (bez ustawiania czegokolwiek bezpośrednio w kontekście EF).

Każda pomoc jest bardzo doceniana.

Dzięki.

Odpowiedzi:

38 dla odpowiedzi nr 1

Podczas tworzenia obiektu ObjectContext konieczne będzie użycie przeciążenia konstruktora, który przyjmuje parametr ConnectionString jako parametr.

Możesz zbudować to ConnectionString za pomocą EntityConnectionStringBuilder. Mówiąc dokładniej, zakładając, że podstawową bazą danych jest SQL Server, możesz użyć SqlConnectionStringBuilder aby zbudować wartość dla EntityConnectionStringBuilder.ProviderConnectionString.

Oto kod, który tworzy ciąg połączenia z serwerem SQL

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

A oto kod, który buduje 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;