(第一码)使用实体框架的生产迁移(第一码)使用实体框架的生产迁移(Using Entity Fram

2019-05-16 21:13发布

我只是在寻找到使用EF迁移对我们的项目,特别是版本之间在生产中执行的模式变迁论。

我见过提到,有执行使用在运行时这些迁移的API DbMigration类,但我找不到任何具体的例子。

理想情况下,我想一个DbMigration每个数据库更改文件,并自动应用应用这些变化从当前版本启动到最新的版本。

Answer 1:

有一个数据库初始化程序,您可以使用来实现迁移到启动最新版本(或更好的dbinitializer将踢在第一DB访问),该MigrateDatabaseToLatestVersion ,你用它这样:

Database.SetInitializer<ObjectContext>(
    new MigrateDatabaseToLatestVersion<ObjectContext, Configuration>());

对于具有每迁移一个文件,如果启用自动迁移,你会在找到他们Migrations在你的项目的根文件夹(默认)。

相关信息,结合实例,在这里: http://weblogs.asp.net/fredriknormen/archive/2012/02/15/using-entity-framework-4-3-database-migration-for-any-project.aspx



Answer 2:

这工作太:

var configuration = new MyDbContextConfiguration();
configuration.TargetDatabase = new DbConnectionInfo(
    database.ConnectionString, database.ProviderName);

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

您也可以拨打:

migrator.GetPendingMigrations();

得到它需要应用迁移的列表。



Answer 3:

既然你没有指定要使用的Visual Studio版本,或数据库,我将在这里补充回答说,在与微软的SQL服务器VS2015,这种使用“发布”工具现在非常容易。

你不需要跟你说的API来打扰。 简单地做你的工作在当地,改变你的模型,应用迁移等,然后当你想推出发布/测试服务器,使用发布工具。

您可以选择适用你在本地进行的任何迁移到远程服务器首次启动应用程序。

一旦你把所有的迁移和一切(在你的开发ENV推测)在本地完成的,那么你发布(右键单击该项目,单击“发布...”,然后勾选“在应用程序启动执行代码首先迁移(运行)”复选框下“设置”选项卡,然后它将应用迁移首次访问应用程序时(因此会有短暂的延迟第一次)。

指南: https://msdn.microsoft.com/en-us/library/dd465337(v=vs.110).aspx

我学会了这一切,因为我不得不这样做是为了在Windows 2012服务器: http://www.sherweb.com/blog/how-to-install-webdeploy-on-windows-server-2012/

祝好运!



Answer 4:

我想控制哪些迁移代码和大量的搜索我设法开发以下技术未启用需要的DbConfiguration类或自动迁移后明确地运行:

public static void RunMigration(this DbContext context, DbMigration migration)
{            
    var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance);
    if (prop != null)
    {
        IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>;
        var generator = new SqlServerMigrationSqlGenerator();
        var statements = generator.Generate(operations, "2008");
        foreach (MigrationStatement item in statements)
            context.Database.ExecuteSqlCommand(item.Sql);
    }
}

如果我们有这样的迁移:

public class CreateIndexOnContactCodeMigration : DbMigration
{
    public override void Up()
    {
        this.CreateIndex("Contacts", "Code");
    }

    public override void Down()
    {
        base.Down();
        this.DropIndex("Contacts", "Code");
    }
}

我们会使用它这样的:

using (var dbCrm = new CrmDbContext(connectionString))
{
    var migration = new CreateIndexOnContactCodeMigration();
    migration.Up();                
    dbCrm.RunMigration(migration);
}

问候。



文章来源: Using Entity Framework (code first) migrations in production