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

Posted

技术标签:

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

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

public class Revision

    ...
    public Boolean IsReleased  get; set; 
    ....

重要提示:

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

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

【问题讨论】:

这可能就是你要找的东西:***.com/a/27920032/1166719 ***.com/questions/40730/… 【参考方案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;
    ....

编辑以包含@BrewMate 的comment:

如果在更新数据库时将所有值设置为 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://***.com/a/46436861/1819403

【讨论】:

【参考方案5】:

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

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

【讨论】:

好的,我希望它会这么简单。添加列时,这会将现有数据库中的现有行设置为 true 吗? 没有。为此,您只需确保在创建列时将其默认值设置为TRUE。 msdn.microsoft.com/en-us/library/ms187872.aspx 好的,但这里的想法是我们通过实体框架代码优先迁移来做到这一点。这就是重点。

以上是关于如何在 Code First 模型中的布尔值上设置默认值?的主要内容,如果未能解决你的问题,请参考以下文章

互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别

flex 3 数据网格:如果 == 0 则隐藏值并在布尔值上显示复选框

布尔值上的 ng-repeat 过滤器

旧的 Code-First 模型在数据库中有字段,但在模型中没有

在布尔值上调用成员函数 attach() - Laravel

多个布尔值上的 Knockout.js“如果绑定”