我有一个现有的表/模型,我想在其中删除一个新的布尔列。该表已有数百行数据,我无法触及现有数据。但是..此列不可为空,因此我需要为当前存在的所有行提供默认值true
。
public class Revision
{
...
public Boolean IsReleased { get; set; }
....
}
重要:
(这是在OP,但人们似乎想念的是。)
使用迁移更新数据库时,接收此新列的所有现有行必须将其值设置为True。
答案 0 :(得分:24)
另一个选项是创建默认构造函数,并使用您需要的默认值设置属性:
public class Revision
{
public Boolean IsReleased { get; set; }
public Revision()
{
IsReleased=true;
}
}
要在运行true
命令时将值设置为现有行的Update-Database
,您可以在Configuration
类中执行此操作:
protected override void Seed(YourContext context)
{
var entities=context.Revisions.Where(r=>!r.IsReleased)
foreach(var e in entities)
{
e.IsReleased=true;
//context.Entry(e).State = EntityState.Modified; If you have disabled change tracking then add this line
}
context.SaveChanges();
}
如果是通过迁移添加的新列,您也可以这样做:
AddColumn("dbo.Revisions", "IsReleased", c => c.Boolean(nullable: false, defaultValue: true));
答案 1 :(得分:2)
根据MSDN,DefaultValueAttribute指定属性的默认值。您可以将DefaultValueAttribute用作 以下:
public class Revision
{
...
[DefaultValue(true)]
public Boolean IsReleased { get; set; } = true;
....
}
此外,您可以在DbMigration类内部使用UP()方法,如下所示:
public partial class InitializeDb : DbMigration
{
public override void Up()
{
CreateTable(
"dbo.Revision",
c => new
{
Id = c.Int(nullable: false, identity: true),
...
IsReleased = c.Boolean(nullable: false, defaultValue: true),
...
})
.PrimaryKey(t => t.Id);
}
}
您应该自己添加“ defaultValue:true”。
答案 2 :(得分:1)
不幸的是我没有使用C#版本来使用@Brandon Minnick的建议,这似乎是最简单的。其他建议似乎很多工作,而不是我最终这样做:https://stackoverflow.com/a/46436861/1819403
答案 3 :(得分:0)
初始化对象时,您可以简单地避免使用自动实现的属性并将属性值设置为true
。
private Boolean _isReleased = true;
public Boolean IsReleased
{
get
{
return _isReleased;
}
set
{
_isReleased = value;
}
}