我有一个实体框架代码优先的应用程序。
在表格中,我必须添加一列。所以我在模型中添加了它并创建了一个Migration。
但是在迁移过程中,我想更新现有条目并为此新列添加值。该值必须从数据库中获取(我的“配置”表中的常量字段)。
但默认值应仅适用于现有条目,而不适用于下一条目。
如何从我的Migration类中完成?
我目前的迁移类:
public override void Up()
{
var theDefaultValue = MyConstants.MyConstantParameterFromDatabase;
AddColumn("MySchema.MyTable", "MyNewColumn", c => c.Decimal(nullable: false, precision: 18, scale: 2));
}
编辑:仍在寻找更新所有现有条目(0值)的解决方案,但仅在此次迁移后...
答案 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
。希望对您有所帮助。