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

Entity framework 可空属性到实体字段,实体框架通过代码优先,entity-framework,asp.net-mvc-3,code-first,nullable,Entity Framework,Asp.net Mvc 3,Code First,Nullable,使用数据注释Required如下所示: [Required] public int somefield {get; set;} 在数据库中将somefield设置为非空,如何设置somefield 为了允许空值?,我尝试通过SQLServerManagementStudio设置它,但EntityFramework将其设置回notnull只需从字符串somefield属性中省略[Required]属性。这将使它在数据库中创建一个NULLable列 要使int类型在数据库中允许null,必须在模型

使用数据注释
Required
如下所示:

[Required]
public int somefield {get; set;}
在数据库中将somefield设置为
非空
,如何设置somefield
为了允许空值?,我尝试通过SQLServerManagementStudio设置它,但EntityFramework将其设置回
notnull
只需从
字符串somefield
属性中省略[Required]属性。这将使它在数据库中创建一个
NULL
able列

要使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; }
//int永远不能为null,因此它将在db中创建为notnull
公共int someintfield{get;set;}
//要获得可为null的int,需要将其声明为int?
//或者作为一个系统。可以为空
公共整数?somenullableintfield{get;set;}
public System.Nullable someothernullableintfield{get;set;}

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
        modelBuilder.Entity<SomeObject>().Property(m => m.somefield).IsOptional();            
        base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().Property(m=>m.somefield.isoOptional();
基于模型创建(modelBuilder);
}

这段代码应该在继承自
DbContext

的对象中,Jon的答案对我不起作用,因为我遇到了一个编译器错误CS0453 C#该类型必须是不可为null的值类型,才能将其用作泛型类型或方法中的参数“t”

但这对我来说很有效:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<SomeObject>().HasOptional(m => m.somefield);
    base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity().has可选(m=>m.somefield);
基于模型创建(modelBuilder);
}
Ef.net core中有两个选项可供选择;首先是数据注释:

public class Blog
{
    public int BlogId { get; set; }
    [Required]
    public string Url { get; set; }
}
或使用fluent 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; }
}
class MyContext:DbContext
{
公共数据库集博客{get;set;}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.Property(b=>b.Url)
.IsRequired(false)//可选情况
.IsRequired()//必需的案例
;
}
}
公共类博客
{
public int BlogId{get;set;}
公共字符串Url{get;set;}
}

您的问题中有更多详细信息,您的财产是一个字符串。要使int允许为null,必须将其声明为可为null的int,如:
public int?somenullableintfield{get;set;}
是的,我的错误,我需要允许null到int类型。情况如何(边缘情况,但我面临的情况),属性用于业务规则验证和mvc的易用性,但需要允许用户保存部分完成的表单(即可能需要一段时间才能完成的长表单)。我需要能够允许EF创建允许空值的列。。猜测它是oncreating中使用的modebuilder,但不知道如果将[Required]放在可为null的属性上,例如“public int?somenullableintfield{get;set;}”?@AXMIM…有点晚了…但是[Required]会发生什么数据注释覆盖int?。我实际上在搜索如何使CodeFirst不为NULL,您的问题完美地回答了它!谢谢:)太好了,谢谢。这解决了我在[Required]字符串方面的问题,允许它们在db中为null,但在MVC助手中强制执行了一项要求为什么不使用ViewModels呢?它可能是模型和viewmodel的一部分,但是基于某些业务逻辑的可选字段。danludwig的答案是更完整的解决方案(),对于EF Core来说,这是有效的答案。