101 votes

Propriété Nullable pour un champ d'entité, Entity Framework through Code First

Utilisation de l'annotation des données Required comme suit :

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

Fixe champ de blé à Not Null dans la base de données, comment puis-je définir champ de blé J'ai essayé de le paramétrer via SQL Server Management Studio mais Entity Framework l'a réinitialisé à Not Null .

8 votes

En fait, je cherchais comment faire pour que CodeFirst fasse NOT NULL et votre question y répond parfaitement ! Merci :)

145voto

danludwig Points 19213

Il suffit d'omettre l'attribut [Required] de l'élément string somefield propriété. Cela lui permettra de créer un NULL dans la base de données.

Pour que les types int autorisent les NULL dans la base de données, ils doivent être déclarés comme ints 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; }

7 votes

Dans votre question, votre propriété est une chaîne de caractères. Pour qu'un int autorise les nullités, vous devez le déclarer comme un nullable int, comme ceci : public int? somenullableintfield { get; set; }

0 votes

Oui, c'est mon erreur, je dois autoriser l'utilisation de null pour les types int.

3 votes

Je ne sais pas comment faire, mais j'ai l'impression qu'il y a un problème avec les attributs qui sont utilisés pour la validation des règles de gestion et la facilité d'utilisation avec mvc, mais je dois permettre à l'utilisateur de sauvegarder des formulaires partiellement remplis (c'est-à-dire des formulaires longs qui peuvent prendre un certain temps). J'ai besoin de pouvoir permettre à EF de créer des colonnes qui autorisent les zéros je suppose que c'est le modebuilder utilisé dans oncreating, mais je ne sais pas comment

37voto

Jon Points 4161

L'autre option consiste à demander à 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 se trouver dans l'objet qui hérite de DbContext .

1 votes

Parfait, merci. Cela a résolu mon problème avec les chaînes [Required], en leur permettant d'être nulles dans la base de données, mais en appliquant une exigence dans les aides MVC.

2 votes

Pourquoi ne pas utiliser les ViewModels ? Cela pourrait être nécessaire dans le modèle de vue et ne pas l'être dans le modèle réel.

0 votes

Il peut faire partie du modèle et du viewmodel, mais il s'agit d'un champ optionnel basé sur une logique métier. la réponse de danludwig est la solution la plus complète ( stackoverflow.com/a/10710934/6486 )

20voto

nzrytmn Points 531

En Ef .net core il y a deux options possibles : tout d'abord, les annotations de données :

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

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

Ou avec une interface utilisateur 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; }
}

Plus de détails aquí

4voto

Jon Points 4583

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

Cela a fonctionné pour moi :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X