2017-02-21 29 views
2

Я пытаюсь программно инициализировать базу данных SQL Server, используя DbMigrator класс от EntityFramework:DbMigrator не вносить изменения в базу данных

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(); 
} 

Странная вещь, что код работает для всех моих сборок базы данных, за исключением одного , По какой-то причине один из БД не является получение инициализации, и я получаю исключение:

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

Когда я открываю SQL Server Profiler, я могу видеть, что все миграции применяются без ошибок. Однако, когда я открываю базу данных в SQL Server Management Studio, я вижу, что она вообще не содержит таблиц.

После дальнейшего расследования выяснилось, что после выполнения dbMigrator.Update транзакция, которую он использует, не привязана к БД (DBCC OPENTRAN выдает, что транзакция по-прежнему открыта). И по какой-то причине данные транзакций отбрасываются, прежде чем я попытаюсь выполнить некоторые запросы, используя MyDataBaseContext.

Что может быть причиной такого поведения? Почему dbMigrator.Update совершает все необходимые миграции для некоторых баз данных, но не для других? Могу ли я управлять транзакциями dbMigrator вручную и заставлять их совершать?

ответ

0

Я столкнулся с той же проблемой. Я закончил работу с

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(); 
    } 
}