配置EF以不删除迁移中的任何表

时间:2015-03-02 16:56:34

标签: c# entity-framework entity-framework-6 ef-migrations

我正在使用EF迁移在运行时动态创建数据库模型。这可能会发生很多次,有时会修改现有的表,有时则不会。每次我进行迁移时,我都不想在整个数据库中创建包含所有DbSets的大量上下文,我只想包含我正在修改的表。
我正在以下列方式进行迁移

        Type contextType = null; //This will be my dbcontext

        DbMigrationsConfiguration migratorConfig = new DbMigrationsConfiguration();

        migratorConfig.ContextType = contextType;
        migratorConfig.TargetDatabase = new DbConnectionInfo("ConnectionString", "System.Data.SqlClient");
        migratorConfig.AutomaticMigrationsEnabled = true;
        migratorConfig.AutomaticMigrationDataLossAllowed = false;
        migratorConfig.ContextKey = "key";
        migratorConfig.MigrationsAssembly = contextType.Assembly;

        DbMigrator dbMigrator = new DbMigrator(migratorConfig);
        dbMigrator.Update();   

有没有什么方法可以配置EF不删除未包含在上下文中但在以前的迁移中出现的表?每次使用不同的ContextKey都不是一种选择,因为EF会抱怨某个物体已经存在 提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用migrator.GetDatabaseMigrations();返回已应用于数据库的正确迁移列表。由于获得了待处理的迁移,因此使用以下内容:

var mg = new DbMigrator(configuration);
var mgpen = mg.GetPendingMigrations().ToList();

你可能希望看到脚本:

var scriptor = new MigratorScriptingDecorator(mg);
string script = scriptor.ScriptUpdate(sourceMigration: null, targetMigration: null);

然后尝试查看/比较它们以满足您的目的。你可能想要customize Migrations History Table这样做:))

注意:重命名ContextKey对于处理每个物理数据库实例管理多个模型非常有用。这是 EF6迁移中称为Multiple Contexts per Database的功能。根据{{​​3}} ContextKey

  

获取或设置用于区分属于的迁移的字符串   属于其他配置的迁移配置   使用相同的数据库。此属性允许从中进行迁移   要应用于单个的多个不同模型   数据库中。

答案 1 :(得分:0)

一种方法是使用手动迁移,但这有点难以实现,但是如果你有一个更大的数据库并且修改次数较少,那么这应该可行。

使用类似的东西,

namespace MigrationsDemo.Migrations 
{ 
    using System; 
    using System.Data.Entity.Migrations; 

    public partial class AddBlogUrl : DbMigration 
    { 
        public override void Up() 
        { 
            AddColumn("dbo.Blogs", "Url", c => c.String()); 
        } 

        public override void Down() 
        { 
            DropColumn("dbo.Blogs", "Url"); 
        } 
    } 
}

请查看更多信息here