我正在使用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会抱怨某个物体已经存在
提前谢谢。
答案 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