web-dev-qa-db-fra.com

Zone de propriété Nullable à entité, Entity Framework via Code First

En utilisant l'annotation de données Required comme ceci:

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

Va mettre un peu de terrain à Not Null dans la base de données, comment puis-je définir un peu de terrain pour autoriser les valeurs NULL?, j’ai essayé de le configurer via SQL Server Management Studio, mais Entity Framework le remettait surNot Null.

58
chrisramon

Omettez simplement l'attribut [Obligatoire] de la propriété string somefield. Cela créera une colonne NULLable dans la base de données.

Pour que les types int autorisent les valeurs NULL dans la base de données, ils doivent être déclarés comme des entités nullables dans le modèle:

// 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; }
91
danludwig

L’autre option consiste à indiquer à EF d’autoriser la colonne à être nulle:

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

Ce code doit être dans l'objet qui hérite de DbContext.

28
Jon

La réponse de Jon n'a pas fonctionné pour moi car j'ai eu une erreur de compilation CS0453 C # Le type doit être un type valeur non nullable pour pouvoir être utilisé comme paramètre 'T' dans le type générique ou la méthode

Cela a fonctionné pour moi si:

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

Dans Ef .net core, vous avez deux options. d'abord avec des annotations de données: 

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

Ou avec une api fluide:

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

Il y a plus de détails ici

0
nzrytmn