【问题标题】:How to set a default value on a Boolean in a Code First model?如何在 Code First 模型中的布尔值上设置默认值?
【发布时间】:2017-04-17 14:54:54
【问题描述】:

我有一个现有的表/模型,我想在其中删除一个新的布尔列。这张表已经有好几百行数据了,现有的数据我也摸不着。但是.. 此列不能为空,因此我需要为当前存在的所有行提供默认值 true

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

重要提示:

(这是在OP中,但人们似乎错过了。)

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

【问题讨论】:

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


【解决方案1】:

另一个选项是创建一个默认构造函数并使用您需要的默认值设置属性:

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

    public Revision()
    {
        IsReleased=true;

    }
}

要在运行Update-Database 命令时将值设置为现有行的true,您可以在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));

【讨论】:

  • 好的,但我认为这不会在添加列时将现有数据库中的现有行设置为 true,对吗?
  • @CaseyCrookston,检查我添加到解决方案中的内容
  • 不知道为什么它被否决了。我投票支持它。感谢更新。
  • 谢谢@CaseyCrookston,你尝试过我的建议了吗?
  • 如果它是您通过迁移添加的新列,也许您也可以这样做:'AddColumn("dbo.Revisions", "IsReleased", c => c.Boolean(nullable: false, defaultValue: true));`,但我记得我试过一次它不能正常工作
【解决方案2】:

您可以避免使用字段并利用 Auto-property initialization,这是 C# 6 中的新功能。

当列添加到数据库时,这会将默认值设置为true

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

编辑以包含@BrewMatecomment

如果在更新数据库时将所有值设置为 false,请确保让 JSON 格式化程序处理默认值。默认情况下,JSON 格式化程序将忽略默认值,然后您的数据库将布尔值设置为其默认值 false。请参阅下面的链接,我会尝试默认为枚举:http://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_DefaultValueHandling.htm

【讨论】:

  • 啊好吧!添加列时,这会将现有数据库中的现有行设置为 true 吗?
  • 是的。在向我的数据库添加新列时,我使用了相同的技术。
  • 我不得不取消这个作为答案。当我进行数据库更新时,它将所有值设置为 False
  • @Casey Crookston 你很好地更新了你的问题,因为从其他答案来看,包括我在内的很多人都对你真正想要实现的目标感到困惑。
  • @CaseyCrookston 更新数据库时将所有值设置为 false 的原因是因为您需要让 json 格式化程序处理默认值。默认情况下,json 格式化程序将忽略默认值,然后您的数据库将布尔值设置为其默认值 false。请参阅下面的链接,我会尝试使用 Default 作为枚举。 newtonsoft.com/json/help/html/…
【解决方案3】:

根据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”。

【讨论】:

    【解决方案4】:

    不幸的是,我不在 C# 版本上,无法使用 @Brandon Minnick 的建议,这似乎是最简单的。其他建议似乎很有效,但我最终这样做了:https://stackoverflow.com/a/46436861/1819403

    【讨论】:

      【解决方案5】:

      您可以在初始化对象时简单地避免自动实现属性并将属性值设置为true

      private Boolean _isReleased = true;
      public Boolean IsReleased 
      { 
          get
          {
              return _isReleased;
          }
          set
          {
              _isReleased = value;
          }
      }
      

      【讨论】:

      • 好的,我希望它会这么简单。添加列时,这会将现有数据库中的现有行设置为 true 吗?
      • 没有。为此,您只需确保在创建列时将其默认值设置为TRUEmsdn.microsoft.com/en-us/library/ms187872.aspx
      • 好的,但这里的想法是我们通过实体框架代码优先迁移来做到这一点。这就是重点。
      猜你喜欢
      • 2013-05-21
      • 2013-03-06
      • 2019-11-09
      • 2015-03-28
      • 1970-01-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      相关资源
      最近更新 更多