web-dev-qa-db-fra.com

Pourquoi EF essaie-t-il d'insérer NULL dans id-column?

Désolé pour mon anglais.

J'écris mon projet en utilisant Entity Framework 4.0 (Model first). Au début du projet, j’ai rencontré le problème suivant: j’essaie d’insérer l’objet rempli dans la base de données, mais j’obtiens une exception:

"Impossible d'insérer la valeur NULL dans la colonne 'CategoryId', table 'ForumDB.dbo.Categories'; la colonne n'autorise pas les valeurs NULL. INSERT échoue. L'instruction a été arrêtée."

    Category usingCategory = new Category("Using Forums", "usingforums", 0);
    using (Context)
    {
        Context.Categories.AddObject(usingCategory);
        Context.SaveChanges();
    }

J'ai vérifié cet objet et je suis sûr qu'il est rempli.

Au cas où:

public Category(string name, string urlName, int index)
{
    CategoryId = Guid.NewGuid();
    Name = name;
    UrlName = urlName;
    CategoryIndex = index;
}

S'il vous plaît dites-moi ce qui se passe? Merci pour toute aide!

17
Kovpaev Alexey

Jetez un coup d'œil à ceci: https://stackoverflow.com/a/5338384/171703 - le cadre de l'entité peut supposer que votre champ CategoryId est une identité et donc transmettre null à la base de données en espérant qu'il le remplisse à votre place .

35
akiller

Je l'ai rencontré aujourd'hui et j'ai dû régénérer mes classes EF à partir de la base de données.

Après cela, j’ai trouvé que EF ajoutait:

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }

à ce champ "Id" qui était auparavant une colonne d'identité dans le code SQL, mais a été modifié pour être attribué à une application. 

Je pense que si vous n'avez pas cet attribut, EF n'enverra pas l'ID à la base de données ('convention over configuration')

23
D.B. Fred

J'avais créé la table avec int Id en tant que PK, mais j'avais oublié de définir "Identity Specification" = True

5
Adam Cox

Essayez d’ajouter ceci dans votre fichier .cs de classe de modèle:

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CategoryId { get; set; }

Ou changez votre colonne CategoryId en identité:

    CategoryId int IDENTITY(1,1)
2
Damir Varevac

A rencontré le même problème aujourd'hui.

Voici comment j'ai compris le problème.

J'avais initialement ajouté le germe d'identité à la colonne, mais je l'ai ensuite supprimé. Je ne savais donc pas que lors de la modification de la définition de la colonne dans le code, l'identifiant 

Propriété (x => x.Id) .HasColumnName (@ "Id"). HasColumnType ("int"). IsRequired ();

Le framework Entity a donc compris qu'il s'agissait d'une colonne Identity et j'ai obtenu l'exception ci-dessus.

Pour résoudre ce problème, l'ajout de " HasDatabaseGeneratedOption (System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None) ", de sorte que l'élément final ressemblait à ceci:

Propriété (x => x.Id) .HasColumnName (@ "Id"). HasColumnType ("int"). IsRequired (). HasDatabaseGeneratedOption (System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);

0
Vikas Sharma