实体字段的可空属性,通过代码优先的实体框架


77

Required像这样使用数据注释:

[Required]
public int somefield {get; set;}

将设置somefieldNot Null数据库中,如何设置somefield 允许空值?我试图通过SQL Server Management Studio,但实体框架的设置将其设置回Not Null


7
我实际上正在寻找找出如何使CodeFirst做NOT NULL的方法,而您的问题完美地回答了它!谢谢:)
安迪·克拉克

Answers:


119

只需从string somefield属性中省略[Required]属性。这将使它NULL在数据库中创建一个有能力的列。

为了使int类型在数据库中允许NULL,必须在模型中将它们声明为可为null的int:

// an int can never be null, so it will be created as NOT NULL in db
public int someintfield { get; set; }

// to have a nullable int, you need to declare it as an int?
// or as a System.Nullable<int>
public int? somenullableintfield { get; set; }
public System.Nullable<int> someothernullableintfield { get; set; }

5
在您的问题中,您的财产是一个字符串。要使int允许为null,必须将其声明为可为null的int,如下所示:public int? somenullableintfield { get; set; }
danludwig 2012年

是的,我的错误,我需要允许null到int类型。
chrisramon

2
情况如何(边缘情况,但我要面对),该属性用于业务规则验证和mvc的易用性,但需要允许用户保存部分完成的表单(例如,较长的表单可能需要一段时间才能保存)。做)。我需要能够允许EF创建允许为null的列..猜测其在oncreating中使用的modebuilder,但不知道如何
Jon

如果将[Required]放在可空属性(如“ public int?somenullableintfield {get; set;}”)上,会发生什么?
AXMIM'8

@AXMIM ...有点晚...但是[必需]数据注释会覆盖int?。
克里斯·卡蒂尼亚尼

31

另一个选择是告诉EF允许该列为空:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<SomeObject>().Property(m => m.somefield).IsOptional();            
        base.OnModelCreating(modelBuilder);
}

此代码应位于继承自的对象中DbContext


1
很好,谢谢。这解决了我的[Required]字符串问题,允许它们在db中为null,但在MVC帮助器中强制执行了一项要求
Derrick

2
为什么不使用ViewModels?比在视图模型中可能需要,而在实际模型中则不需要。
Roel 2015年

它可能是模型和视图模型的一部分,但是是基于某些业务逻辑的可选字段。danludwig的答案是更完整的解决方案(stackoverflow.com/a/10710934/6486
乔恩·

8

Ef .net核心中,您可以执行两个选择:首先带有数据注释:

public class Blog
{
    public int BlogId { get; set; }
    [Required]
    public string Url { get; set; }
}

或使用流利的api:

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .IsRequired(false)//optinal case
            .IsRequired()//required case
            ;
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

还有更多的细节在这里


1
对于EF Core,这就是有效的答案。
joanlofe

4

乔恩的答案对我不起作用,因为我遇到编译器错误CS0453 C#类型必须是非空值类型,才能在通用类型或方法中将其用作参数“ T”

这对我有用:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<SomeObject>().HasOptional(m => m.somefield);
    base.OnModelCreating(modelBuilder);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.