2017-02-21 5 views
2

Ich versuche programmatisch eine SQL Server-Datenbank zu initialisieren mit DbMigrator Klasse von EntityFramework:DbMigrator begeht keine Änderungen an Datenbank

var configuration = new MyDataBaseAssembly.Migrations.Configuration(); 
configuration.TargetDatabase = new System.Data.Entity.Infrastructure.DbConnectionInfo(myConnectionString, "System.Data.SqlClient"); 

var dbMigrator = new DbMigrator(configuration); 
dbMigrator.Update(); 

using (var context = new MyDataBaseAssembly.MyDataBaseContext(myConnectionString)) 
{ 
    // do some queries 
    context.MyTable1.ToList(); 
} 

Das Seltsame ist, dass der Code für alle meine Datenbank-Baugruppen mit einer Ausnahme gut funktioniert . Aus irgendeinem Grund eine der DB ist nicht initialisiert zu werden, und ich empfange eine Ausnahme:

System.Data.SqlClient.SqlException: Invalid object name 'dbo.MyTable1'. 

Wenn ich den SQL Server Profiler zu öffnen, kann ich sehen, dass alle Migrationen ohne Fehler angewendet werden. Wenn ich die Datenbank in SQL Server Management Studio öffne, kann ich jedoch sehen, dass es überhaupt keine Tabellen enthält.

Nach weiteren Untersuchungen, fand ich heraus, dass nach dbMigrator.Update ausgeführt wird, ist die Transaktion, die es verwendet, nicht an die DB (DBCC OPENTRAN Ausgänge, dass die Transaktion noch offen ist) verpflichtet. Und aus irgendeinem Grund werden die Transaktionsdaten verworfen, bevor ich versuche, einige Abfragen mit MyDataBaseContext durchzuführen.

Was kann die Ursache für ein solches Verhalten sein? Warum schreibt dbMigrator.Update alle erforderlichen Migrationen für einige Datenbanken fest, aber nicht für andere? Kann ich dbMigrator Transaktionen manuell steuern und sie zum Commit zwingen?

Antwort

0

Ich lief auf das gleiche Problem. Ich habe am Ende mit

var scriptor = new MigratorScriptingDecorator(dbMigrator); 
var script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null); 
using (var conn = new SqlConnection(connString)) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand(script, conn)) 
    { 
     cmd.ExecuteNonQuery(); 
    } 
} 
umgehen
Verwandte Themen