gpt4 book ai didi

c# - 在迁移 Up 方法中更改数据 - Entity Framework

转载 作者:IT王子 更新时间:2023-10-29 03:59:49 26 4
gpt4 key购买 nike

我在现有模型中添加了一个新属性。它是一个默认值为 true 的 bool 属性。此表中已有数据,我想在创建新字段后立即在 Up 方法中将一个特定行的新属性设置为 false。

public override void Up()
{
AddColumn("dbo.RequestValidationErrors", "IsBreaking",
c => c.Boolean(nullable: false));
using (Context ctx = new Context())
{
var validation =
ctx.RequestValidationErrorSet
.FirstOrDefault
(x => x.WordCode == "RequestValidationError.MoreThanOneItemFound");
if (validation != null)
{
validation.IsBreaking = false;
ctx.SaveChanges();
}
}
}
}

这样 EF 在 saying 时会抛出错误

System.InvalidOperationException: The model backing the'DbContext' context has changed since the database was created.Consider using Code First Migrations to update the database

是否可以在此处更改数据库,还是应该在其他地方更改?

最佳答案

在迁移过程中,最好使用Sql()方法来更新数据库数据。

Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = 'RequestValidationError.MoreThanOneItemFound'");

您还应该为新列定义默认值。所以解决方案应该是这样的:

public override void Up()
{
AddColumn("dbo.RequestValidationErrors", "IsBreaking", c => c.Boolean(nullable: false, default: true));
Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = \"RequestValidationError.MoreThanOneItemFound\"");
}

在迁移过程中使用 DbContext 是非常不明确的。你对上下文有什么期望?它在其模型中具有迁移后状态,但数据库在表中具有迁移前状态。所以模型和数据库不匹配。如果您仍然坚持在代码中使用 DbContext,那么禁用模型检查可能是解决方案。您可以使用以下方法禁用模型检查:

Database.SetInitializer<Log4ProContext>(null);

更新:

从 EF Core 2.1 开始,您可以使用 UpdateData 而不是 Sql 方法来处理更简单的情况,就像@ntfrex 在回答中提到的那样:

migrationBuilder.UpdateData(
table: "RequestValidationErrors",
keyColumn: "WordCode",
keyValue: "RequestValidationError.MoreThanOneItemFound",
column: "IsBreaking",
value: false);

我的建议是不要在迁移中的任何地方对表名和列名使用nameof 运算符。因为稍后重命名这些类会导致旧的迁移在生产中失败,因为数据库中的表名仍然是旧名称。

关于c# - 在迁移 Up 方法中更改数据 - Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33516705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com