我正在学习EF Code First Migrations。我在现有表中添加了一个新列
public partial class Test2 : DbMigration
{
public override void Up()
{
AddColumn("dbo.Recipes", "DeafultNumberOfServes", c => c.Int(nullable: false));
Sql("UPDATE dbo.Recipes SET DeafultNumberOfServes = 4");
}
public override void Down()
{
DropColumn("dbo.Recipes", "DeafultNumberOfServes");
}
}
我现在想要更新该表中的现有行并将DeafultNumberOfServes设置为4
它适用于我的Configuration类的Seed方法,但感觉很狡猾
getScale()
我还尝试将它放在Migration类本身,但就好像sql永远不会运行,并且所有行都包含该列中的默认值。
onScaleChanged(WebView, float, float)
那么处理添加列然后将所有现有行更新为值的最佳方法是什么?
答案 0 :(得分:0)
在行之间进行读取,如果用户没有指定它,您似乎希望DeafultNumberOfServes
属性默认为4而不是0。您可以通过将Up
迁移中的代码更改为:
public override void Up()
{
AddColumn("dbo.Recipes",
"DeafultNumberOfServes",
c => c.Int(nullable: false, defaultValue: 4));
}
当您拥有现有数据并希望添加不可为空的列而不遇到错误时,这非常有用。它并不意味着如果用户没有指定它,该值将默认为4。这是因为EF会发送一个int的默认值(即零),除非你在代码中设置它,这将覆盖数据库值。
因此您需要在代码中设置默认值。您可以通过在构造函数或支持字段(这是我的首选项)中指定它来执行此操作:
public class Recipe
{
private _DefaultNumberOfServes = 4;
public int DeafultNumberOfServes
{
get{ return _DefaultNumberOfServes;}
set{ _DefaultNumberOfServes = value}
}
}
BTW,您的迁移看起来不起作用的原因是因为迁移在您的种子之前在空表上运行 - 因此没有任何更新 - 表是空的,因为您使用的是初始化程序"永远删除并重新创建数据库"。我建议改为转移到最新版本"相反,初始化程序会让您陷入使用现有数据迁移到数据库的陷阱。