【问题标题】:Nullable property to entity field, Entity Framework through Code First实体字段的可空属性,通过代码优先的实体框架
【发布时间】:2012-05-29 10:30:12
【问题描述】:

像这样使用数据注解Required

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

将在数据库中将 somefield 设置为 Not Null,我该如何设置 somefield 允许 NULL 吗?我尝试通过 SQL Server Management Studio 进行设置,但实体框架将其设置回 Not Null

【问题讨论】:

  • 我实际上是在寻找如何让 CodeFirst 不为空,而您的问题完美地回答了它!谢谢:)

标签: entity-framework asp.net-mvc-3 code-first nullable


【解决方案1】:

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

要使 int 类型在数据库中允许 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; }

【讨论】:

  • 在您的问题中,您的属性是一个字符串。要使 int 允许空值,您必须将其声明为可为空的 int,如下所示:public int? somenullableintfield { get; set; }
  • 是的,我的错误,我需要允许 null 到 int 类型。
  • 情况如何(边缘情况,但我面临的情况),属性用于业务规则验证和 mvc 的易用性,但需要允许用户保存部分完成的表单(即可能需要一段时间才能完成的长表格)。我需要能够允许 EF 创建允许空值的列.. 猜测它是在创建时使用的模式构建器,但不知道如何
  • 如果您将 [Required] 放在“public int?somenullableintfield { get; set; }”等可为空的属性上会发生什么?
  • @AXMIM...有点晚了...但是 [必需] 数据注释会覆盖 int?。
【解决方案2】:

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

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

这段代码应该在继承自DbContext的对象中。

【讨论】:

  • 完美,谢谢。这解决了我的 [Required] 字符串问题,允许它们在数据库中为空,但在 MVC 帮助程序中强制执行要求
  • 为什么不使用 ViewModels?比视图模型中可能需要它,而实际模型中不需要它。
  • 它可能是模型和视图模型的一部分,但是基于某些业务逻辑的可选字段。 danludwig 的回答是更完整的解决方案 (stackoverflow.com/a/10710934/6486)
【解决方案3】:

Jon 的回答对我不起作用,因为我遇到了编译器错误 CS0453 C# 类型必须是不可为空的值类型才能在泛型类型或方法中用作参数“T” em>

这对我有用:

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

【讨论】:

  • 这是因为您将整数值定义为 'int' 而不是 'int?'
【解决方案4】:

Ef .net core 中有两个选项可供您选择;首先是数据注释:

public class Blog
{
    public int BlogId { get; set; } // optinal case

    [Required]
    public string Url { get; set; } // required case
}

或者使用流畅的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; }
}

还有更多详情here

【讨论】:

  • 对于 EF Core,这是可行的答案。
  • 哪个是可以为空的,你能详细说明一下吗?
  • @SuatAtanPhD .IsRequired(false) 如果您没有将 false 设置为输入参数而不是必需的,则该列可以为空,例如 .IsRequired()
猜你喜欢
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多