实体框架迁移 - 添加具有现有条目值的新列

时间:2014-12-17 09:53:56

标签: c# entity-framework ef-code-first ef-migrations

我有一个实体框架代码优先的应用程序。

在表格中,我必须添加一列。所以我在模型中添加了它并创建了一个Migration。

但是在迁移过程中,我想更新现有条目并为此新列添加值。该值必须从数据库中获取(我的“配置”表中的常量字段)。

但默认值应仅适用于现有条目,而不适用于下一条目。

如何从我的Migration类中完成?

我目前的迁移类:

public override void Up()
{
    var theDefaultValue = MyConstants.MyConstantParameterFromDatabase;
    AddColumn("MySchema.MyTable", "MyNewColumn", c => c.Decimal(nullable: false, precision: 18, scale: 2));
}

编辑:仍在寻找更新所有现有条目(0值)的解决方案,但仅在此次迁移后...

2 个答案:

答案 0 :(得分:15)

您只需修改Up()方法,并在其中包含一个SQL语句来设置现有行中的列值。这仅在更新数据库时执行,并且更新涉及此特定迁移。因此,只有在调用Update-Database时才会更新现有的行。

AddColumn命令之后添加这样的代码,以便在SQL语句运行时该列已在表中可用:

Sql("UPDATE dbo.MyTable SET Column = (SELECT val FROM config)");

注意:(SELECT val FROM config)是伪代码,您必须使用返回所需值的查询替换

答案 1 :(得分:0)

我想在运行Postgresql时从现有列复制一个值并将其插入到update-database数据库中新引入的列中。因此,我在Up类中编辑了Migration函数。

protected override void Up(MigrationBuilder migrationBuilder) {
    migrationBuilder.AddColumn < string > (
    name: "FileName", table: "FavoriteFiles", nullable: false, defaultValue: "");
    migrationBuilder.Sql("UPDATE \"FavoriteFiles\" SET \"FileName\" = SPLIT_PART(\"FilePath\", '/', 7) WHERE \"FilePath\" IS NOT NULL;");
}

然后我运行了Update-Database。希望对您有所帮助。