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!
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 .
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')
J'avais créé la table avec int Id en tant que PK, mais j'avais oublié de définir "Identity Specification" = True
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)
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);