2016-04-19 3 views
0

Ich habe eine Anwendung mit Entity Framework 6 erstellt, einige Methoden erstellt, um Extrahierungsdaten aus einer Datenbank einzufügen, und möchte sie jetzt sowohl für eine Produktions- als auch für eine Debugging-Umgebung testen .Zwei identische generierte Datenbanken mit Entity Framework 6

Um sicher zu gehen, dass alles funktioniert, wie ich es gerne hätte, sollte die Debugging-Datenbank alle Daten für meine Tests löschen, während meine Produktion ihre Daten behalten sollte.

Ich habe zwei Projekte: MyApp.Database und MyApp.Database.Test, und sie haben jeweils eine Verbindungszeichenfolge in ihrem app.config -datei, das das Programm geladen wird, wie so:

public DatabaseContext() : base("name=MyDB") 
{ 
    System.Data.Entity.Database.SetInitializer<DatabaseContext>(new CreateDatabaseIfNotExists<DatabaseContext>()); 
} 

und Anschluss-string, wo die database Parameter auf MyProdDB und MyTestDB:

<connectionStrings> 
    <add name="MyDB" connectionString="Host=localhost;user id=myUser;password=myPassword;database=MyProdDB" providerName="Npgsql" /> 
</connectionStrings> 

Wenn ich die Anwendung ausführen, und die Tests laufen, ich habe die richtige Verbindungszeichenfolge für jede Art erhalten der Datenbank. Aber ich erhalte einen Fehler, wenn ich meine Tests: 42P01: relation "dbo.Tags" does not exist laufen lasse. Eine einfache Nachricht, die besagt, dass ich meine Daten nicht in meine Testdatenbank migriert habe.

Aber wie migriere ich es in die Testdatenbank?

Ich habe versucht, den Test-Projekt in der Package manager Console, und die folgenden Befehle auswählen:

PM> Add-Migration "Init" 
No migrations configuration type was found in the assembly 'MyApp.Database.Test'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration). 

PM> Update-Database 
Specify the '-Verbose' flag to view the SQL statements being applied to the target database. 
No migrations configuration type was found in the assembly 'MyApp.Database.Test'. (In Visual Studio you can use the Enable-Migrations command from Package Manager Console to add a migrations configuration). 

PM> Enable-Migrations 
No context type was found in the assembly 'MyApp.Database.Test'. 

Muss ich meine eigene DbContext Klasse für MyApp.Database.Test angeben, welche fast eine Replik MyApp.Database ist?

+0

Ich bin verwirrt, ob Sie versuchen, Unit-Tests oder zwei verschiedene Umgebungen zu konfigurieren - ART und DEV. IAC, wahrscheinlich möchten Sie nur Ihren Kontext in einem einzigen Projekt, in dem Migrationen leben werden. Um PROD zu aktualisieren, können Sie entweder Ihre Verbindungszeichenfolge (im Kontextprojekt) auf PROD verweisen und die Migrationen ausführen, oder Sie können ein Skript generieren, um die andere Datenbank "update-database -Script" zu aktualisieren. –

+0

Ich brauche Integrationstests für dieselbe Umgebung. Ich will keine Daten in PROD verlieren - nur in DEV. Mein PROD ist auf dem neuesten Stand und funktioniert wie es sollte. Wenn ich versuche, '' Update-Database -Script'' zu starten, heißt das, dass keine expliziten Migrationen vorliegen. Kann ich darum bitten, jede Migration von 0 zu übernehmen? –

+0

Stellt sich heraus, kann ich: '' Update-Datenbank -Script - SourceMigration: 0''. Lass uns sehen, wo das mich hinführt ... –

Antwort

0

Wenn Sie in Ihrer DEV-Umgebung keine Daten benötigen, löschen Sie einfach die Datenbank. Sie verwenden CreateDatabaseIfNotExists, sodass eine neue Datenbank mit einem aktuellen Schema erstellt wird. Mehr als das können Sie Ihren Initialisierer in der Konfigurationsdatei konfigurieren. Verwenden Sie CreateDatabaseIfNotExists Inializer auf PROD und DropCreateDatabaseIfModelChanges auf DEV. Wenn sich also das Modell ändert, müssen Sie Migrationen auf PROD verwenden, aber DEV wird nur die Datenbank löschen und neu erstellen.

Beispiel:

<contexts>  
    <context type="Elmah.SqlServer.EFInitializer.ElmahContext, Elmah.SqlServer.EFInitializer"> 
    <databaseInitializer type="Elmah.SqlServer.EFInitializer.ElmahDatabaseInitializer, Elmah.SqlServer.EFInitializer" /> 
    </context>  
</contexts> 

oder schauen here

+0

Das ist Teil der Lösung, glaube ich - aber DEV enthält immer noch keine Tabellen ... Muss ich nicht irgendeine Art von '' Update-Database'' darauf machen ? –

+0

nach dem Ausführen von CreateDatabaseIfNotExists Inializer-Datenbank enthält alle Tabellen des Schemas, die in Ihrem Modell beschrieben –

+0

Das bedeutet, dass ich Folgendes in der gleichen Datei tun: https://gist.github.com/Limro/48017ebbd7e80f95e76396a7f7231f02 –

Verwandte Themen