如何在Code First模型中的布尔值上设置默认值?

时间:2016-12-02 16:15:03

标签: c# entity-framework ef-code-first

我有一个现有的表/模型,我想在其中删除一个新的布尔列。该表已有数百行数据,我无法触及现有数据。但是..此列不可为空,因此我需要为当前存在的所有行提供默认值true

public class Revision
{
    ...
    public Boolean IsReleased { get; set; }
    ....
}

重要:

(这是在OP,但人们似乎想念的是。)

使用迁移更新数据库时,接收此新列的所有现有行必须将其值设置为True。

4 个答案:

答案 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;
    }
}