2016-05-31 70 views
0

我的团队开发了一个在客户系统上部署MSSQL数据库的应用程序。我们遇到了使用迁移来更新客户数据库结构的问题。实体框架6 - 如何使用CodeFirst迁移更新客户数据库

我们不能使用自动化迁移,因为应用程序的多个实例可以在同一个数据库上运行,所以如果其中一个实例更新并因此更改了模型并因此更改了数据库的结构,他们可以在数据库上工作。

我们不能使用nonautomated migrations,因为我们无法访问客户的数据库来运行update-database命令。

问题是什么是最好的方法来保持数据库和模型始终保持最新的代码级别?

回答

0

您必须使用迁移到最新版本的策略。这apporach可以自动更新时模型更改数据库:

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, MyMagicDatabaseConfiguration>()`); 
public class MyMagicDatabaseConfiguration : DbMigrationsConfiguration<MyDbContext> 
    { 
    public MyMagicDatabaseConfiguration() 
    { 
     this.AutomaticMigrationsEnabled = true; 
     this.AutomaticMigrationDataLossAllowed = true; 
    } 
    } 

// !!Force the initialization. this will execute the update!! 
MyDb.Context.Database.Initialize(true); 

这工作得很好,如果您正在使用MS SQL Server的


你正在使用MySQL的问题,你所要做的一切通过你自己!:

var migrator = new DbMigrator(new DbMigrationsConfiguration ()); 

    migrator.Update(); 

    // In the migrtaions directory: 

    public partial class MyMigration : DbMigration 
    { 
    public override void Up() 
    { 
     AddColumn("dbo.MyTable", "AnyName", c => c.Boolean(nullable: false)); 
    } 
    public override void Down() 
    { 
     DropColumn("dbo.MyTable", "AnyName"); 
    } 
    } 

这不是一件容易的工作,我不建议你这样做。只需使用SQL Server应用程序,这将保证您的时间安全。 还有一点需要注意:如果更改无法自动处理,魔术师迁移有时不起作用(复杂的键更改)。

您还可以使用迁移到目标版本:

var configuration = new DbMigrationsConfiguration(); 
     var migrator = new DbMigrator(configuration); 

     migrator.Update("HereMigrationId"); 
     var scriptor = new MigratorScriptingDecorator(migrator); 
     var migrationScript = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: "HereMigrationId"); 

在你的情况,你需要迁移到目标版本。 与解析器可以在迁移过程中修改迁移脚本。

+0

我们使用MSSQL,我们有相同的初始化设置,这正是问题所在。如果两个版本的应用碰巧在这些设置中使用相同的数据库,他们将不断更改结构。我们可以使用它,但我们需要一种方法来告诉旧版本,它使用旧的结构,并在开始更改数据库之前强制它进行更新。问题是,我们无法找到一种方法来确定哪个版本的数据库较旧版本无需启动更改 – SebOlens

+0

我已更新答案,我希望这可以帮助您解决问题。 donot忘记投票^^ –

+0

仍然是一样的...如果应用程序的一个实例(假设版本1.0)有最新的迁移“a”和第二个实例(假设它是新更新的2.0版本)有“b”,并且如果他们都在同一个数据库上工作,他们都会尝试将其更改为迁移。我对吗 ? 有什么方法可以查看数据库中最新的迁移,并且如果应用程序方案与结构不匹配,则会强制它下载最新的应用程序更新? – SebOlens

相关问题