105

Using the data annotation Required like so:

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

Will set somefield to Not Null in database, How can I set somefield to allow NULLs?, I tried setting it through SQL Server Management Studio but Entity Framework set it back to Not Null.

1
  • 8
    I was actually searching to find out how to get CodeFirst to do NOT NULL and your question answered it perfectly! Thanks :) Commented Oct 31, 2012 at 10:34

4 Answers 4

149

Just omit the [Required] attribute from the string somefield property. This will make it create a NULLable column in the db.

To make int types allow NULLs in the database, they must be declared as nullable ints in the model:

// 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; }
Sign up to request clarification or add additional context in comments.

7 Comments

In your question your property is a string. To make an int allow nulls, you have to declare it as a nullable int, like so: public int? somenullableintfield { get; set; }
Yes, my mistake, i need allow null to int types.
what about the situation (edge case, but one I am facing), the attributes are used for business rule validation and ease of use with mvc, but need to allow user to save partially completed forms (i.e. long forms that may take a while to do). I need to be able to allow EF to create columns that allow nulls.. guessing its the modebuilder used in oncreating, but don't know how
what happen if you put [Required] on a nullable property like "public int? somenullableintfield { get; set; }"?
@AXMIM...a little late...but [Required] data annotation overrides int?.
|
38

The other option is to tell EF to allow the column to be null:

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

This code should be in the object that inherits from DbContext.

3 Comments

Perfect, thanks. This solved my problem with [Required] strings, allowing them to be null in the db, but enforcing a requirement in MVC helpers
Why don't you use ViewModels? Than it could be required in the viewmodel and not required in the real model.
it might be part of the model and viewmodel, but an optional field based on some business logic. danludwig's answer is the more complete solution (stackoverflow.com/a/10710934/6486)
23

In Ef .net core there are two options that you can do; first with data annotations:

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

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

Or with 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; }
}

There are more details here

3 Comments

In the case of EF Core this is the answer that works.
Which is reflect the nullable, can you elaborate please?
@SuatAtanPhD .IsRequired(false) makes that column nullable if you don't set false as a input parameter than it is required, like .IsRequired()
4

Jon's answer didn't work for me as I got a compiler error CS0453 C# The type must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method

This worked for me though:

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

1 Comment

This is because you have defined the integer value as 'int' instead of 'int?'

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.