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

Configure EF to not drop any tables in migration

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

        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 会抱怨某个对象已经存在。
提前致谢。

您可以使用 migrator.GetDatabaseMigrations(); 其中 returns 已应用于数据库的正确迁移列表。并使用以下命令来获取挂起的迁移:

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

您可能想通过以下方式查看脚本:

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

然后尝试see/compare它们来满足您的目的。你可能想 customize Migrations History Table 吃这个 :)

注意:重命名 ContextKey 有助于处理每个物理数据库实例的多个模型管理。这是 EF6 Migrations 中称为 Multiple Contexts per Database. According to MSDN ContextKey 的一项功能:

Gets or sets the string used to distinguish migrations belonging to the configuration from migrations belonging to other configurations using the same database. This property enables migrations from multiple different models to be applied to applied to a single database.

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

使用类似的东西,

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