Per*_*ier 42 c# asp.net-mvc entity-framework ef-migrations
我在现有模型中添加了一个新属性.它是一个bool属性,默认值为true.此表中存在现有数据,我想在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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样,EF在说话时会抛出错误
System.InvalidOperationException:自创建数据库以来,支持'DbContext'上下文的模型已更改.考虑使用Code First Migrations来更新数据库
是否可以在此更改数据库,还是应该在其他地方更改数据库?
meh*_*dvd 51
在迁移过程中,最好使用Sql()
方法来更新数据库数据.
Sql("UPDATE dbo.RequestValidationErrors SET IsBreaking = 0 WHERE WordCode = 'RequestValidationError.MoreThanOneItemFound'");
Run Code Online (Sandbox Code Playgroud)
您还应该为新列定义默认值.所以解决方案应该是这样的:
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\"");
}
Run Code Online (Sandbox Code Playgroud)
DbContext
在它的中间使用a 是非常模糊的.您对上下文的期望是什么?它在模型中具有迁移后状态,但数据库在表中具有迁移前状态.所以模型和数据库不匹配.如果您仍坚持在DbContext
代码中使用,则禁用模型检查可能是解决方案.您可以使用以下方法禁用模型检
Database.SetInitializer<Log4ProContext>(null);
Run Code Online (Sandbox Code Playgroud)
use*_*386 17
如果要将框架用于此类更改,则应将数据库更改与数据更改分开.
仅为数据库更改创建迁移,然后执行.
然后创建一个新的迁移(Up()和Down()方法将为空).您现在可以实例化DatabaseContext,并且不会出现错误.这样,您可以使用Framework进行这些更改,并正确实现Down()方法.
Sql
您也可以使用该UpdateData
方法,而不是使用该方法.
migrationBuilder.UpdateData(
table: "RequestValidationErrors",
keyColumn: "WordCode",
keyValue: "RequestValidationError.MoreThanOneItemFound",
column: "IsBreaking",
value: false);
Run Code Online (Sandbox Code Playgroud)
(我不知道是否只有ef核心支持这种方法)
归档时间: |
|
查看次数: |
26502 次 |
最近记录: |