如何使用Entity Framework 6 Code First设置默认值约束?

ECC*_*Dan 31 .net c# entity-framework ef-code-first entity-framework-6

在旧版应用程序中,大多数字符串属性不能为null,并且需要具有默认值string.empty.

我知道可以通过迁移执行此操作,但我正在寻找使用流畅配置界面执行此操作的方法:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Properties<string>().Configure(c =>
        {
            c.HasMaxLength(255);

            if (!c.ClrPropertyInfo.IsDefined(typeof (NullableAttribute), false))
            {
                c.IsRequired();
                // I want to set a default value (string.empty) here.
            }
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,或者我注定要初始化实体构造函数中的所有字符串?

Col*_*lin 45

不幸的是,现在的答案是"不".

但您可以投票支持更好地支持默认值

编辑2015年3月30日: 它将进入EF7 ... 支持Code First中的数据库默认值

编辑2017年1月30日:对默认数据库值的一般支持是EF Core(EF7的新名称)的一部分... 默认值

编辑2018年1月17日:我不确定为什么人们评论说EF7仍然是一个"白日梦".EF7(更名为EF Core)于2016年6月27日发布,支持使用FluentAPI在Code First中设置默认值,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.Rating)
        .HasDefaultValue(3);
}
Run Code Online (Sandbox Code Playgroud)

EF Core 2.0于2017年8月14日发布

  • EF7是一个梦想,不适用于生产.我们现在需要在EF6中使用它! (4认同)
  • @Colin EF核心团队自己承认,在将EF6替换为"推荐版本"之前,缺少相当多的功能:https://github.com/aspnet/EntityFrameworkCore/wiki/roadmap (3认同)
  • 我很惊讶。EF 已经存在 10 年了。我在设计数据库时所做的最基本的事情就是设置默认值。这个功能应该在 10 年前的版本 1 中就已经存在了。相反,EF 团队花费了所有的时间试图让 EF 成为宇宙之谜的一个全能歌舞的答案;当然,也失败了。不适合目的。 (2认同)

Gh6*_*h61 16

现在答案是肯定的:

AddColumn("[table name]", 
          "[column name]", 
          c => c.Boolean(nullable: false, defaultValue: false));
Run Code Online (Sandbox Code Playgroud)

  • 为什么`DbMigration.AddColumn`方法被标记为答案,当问题"我知道可以通过迁移执行此操作时,但我正在寻找使用流畅配置界面执行此操作的方法"? (40认同)
  • 同意.这个答案没有回答这个问题. (7认同)
  • 我同意,不应该选择它作为答案.但也许它可以帮助其他人.我不知道答案是否可以不被选中.现在更好的答案是@Colin's (3认同)
  • 谢谢.我们最终转而使用NHibernate,但希望这个答案可以帮助其他人. (2认同)

Ari*_*aes 8

您可以在构造函数中设置默认值

class Foo : Model
{
    public bool DefaultBool { get; set; }

    public Foo()
    {
        DefaultBool = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

创建新项时Foo,它将为属性设置true值DefaultBool.这不是默认约束,但它可以工作.

  • 这根本没有回答问题。OP和其他人(包括我自己)来这里是为了了解如何在表上设置默认约束。 (4认同)