Nullable property to entity field, Entity Framework through Code First
Asked Answered
A

4

103

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.

Avian answered 22/5, 2012 at 21:23 Comment(1)
I was actually searching to find out how to get CodeFirst to do NOT NULL and your question answered it perfectly! Thanks :)Unicorn
D
146

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; }
Drayman answered 22/5, 2012 at 22:13 Comment(7)
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; }Drayman
Yes, my mistake, i need allow null to int types.Avian
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 howEt
what happen if you put [Required] on a nullable property like "public int? somenullableintfield { get; set; }"?Picrotoxin
@AXMIM...a little late...but [Required] data annotation overrides int?.Minutes
@Drayman I made a class where there is no required but in the DB it is showing not null.Kathyrnkati
I believe as of C# 10, you will explicit have to add ? to string also, in order to have mssql server table display checkmark under 'allow nulls'. Hence a string property would have to look like: public string? name {get; set;}Tadtada
E
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.

Et answered 1/8, 2012 at 15:19 Comment(3)
Perfect, thanks. This solved my problem with [Required] strings, allowing them to be null in the db, but enforcing a requirement in MVC helpersNietzsche
Why don't you use ViewModels? Than it could be required in the viewmodel and not required in the real model.Soler
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 (https://mcmap.net/q/209656/-nullable-property-to-entity-field-entity-framework-through-code-first)Et
Z
21

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

Zwick answered 18/12, 2018 at 10:44 Comment(3)
In the case of EF Core this is the answer that works.Geerts
Which is reflect the nullable, can you elaborate please?Warford
@SuatAtanPhD .IsRequired(false) makes that column nullable if you don't set false as a input parameter than it is required, like .IsRequired()Zwick
E
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);
}
Et answered 14/7, 2016 at 17:16 Comment(1)
This is because you have defined the integer value as 'int' instead of 'int?'Octoroon

© 2022 - 2024 — McMap. All rights reserved.