Pourquoi EF Essayer d'insérer NULL en colonne id?

J'écris mon projet en utilisant Entity Framework 4.0 /Premier modèle/. Au début du projet, j'ai rencontré un tel problème: j'essaie d'insérer un objet terminé dans la base de données, mais je reçois une exception:

Impossible d'insérer une valeur NULL en colonne 'CategoryId', table 'ForumDB.dbo.Categories'; la colonne n'autorise pas les valeurs null. INSERT Retomber. La demande a été interrompue.

Le code:


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


Que ce passe-t-il?
Invité:

Emile

Confirmation de:

Jetez un coup d'oeil:

- entity framework peut assumer votre champ CategoryId est un identifiant et donc des transferts null Dans la base de données, l'attente de le remplir pour vous.

Hannah12

Confirmation de:

J'ai rencontré cela aujourd'hui et j'ai dû restaurer mes cours EF De la base de données.

Après cela j'ai trouvé que EF Ajoutée:


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


À ce champ"Id", qui était la colonne d'identifiant dans SQL, Mais il a été changé pour être une application désignée.

Je pense que si vous n'avez pas cet attribut, alors EF effectivement n'enverra pas ID Dans la base de données /"Contrat de configuration"/./

Damien

Confirmation de:

J'ai créé une table avec un identifiant int comme PK, Mais j'ai oublié d'établir "Identity Specification" = True

Emmanuel

Confirmation de:

Essayez de l'ajouter au fichier de classe modèle .cs:


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


Ou changer votre colonne CategoryId sur identity:


CategoryId int IDENTITY/1,1/

Agathe

Confirmation de:

Aujourd'hui, j'ai rencontré le même problème.

Voici comment j'ai compris cette question.

Initialement, j'ai ajouté la graine d'identité dans la colonne, mais après cela l'a supprimé.
Par conséquent, je n'ai pas compris que lorsque je modifierai d'abord la définition de la colonne dans l'identifiant de code


Property/x => x.Id/
.HasColumnName/"Id"/
.HasColumnType/"int"/
.IsRequired//;


Alors, Entity framework J'ai découvert que ceci est la colonne Identifiant et j'ai reçu une exception ci-dessus.

Pour résoudre ce problème, j'ai ajouté ce qui suit:


HasDatabaseGeneratedOption/DatabaseGeneratedOption.None/


La partie finale était donc approximativement comme celle-ci:


Property/x => x.Id/
.HasColumnName/"Id"/
.HasColumnType/"int"/
.IsRequired//
.HasDatabaseGeneratedOption/DatabaseGeneratedOption.None/;

Florian

Confirmation de:

Pour moi, j'ai eu un autre régime autre que la norme. Le nom de la clé d'identification était - C'est l'absence dans cette partie du régime - fixé dans la base de données, et tout s'est bien passé.
Comment c'était ;


PK_TableName


Comment je l'ai changé


PK_mySchema.TableName

Christine

Confirmation de:

0

Si vous n'utilisez pas code first ou db first oracle dont create be sequnce Vous essayez de l'exécuter en utilisant une séquence


CREATE OR REPLACE TRIGGER 
"a"."IHALEYOL"
before insert on "a"."IHALEYOL"
for each row
begin
select "a"."SQ_DIREK".nextval into :new."ID" from dual;
end;


Piste.:


create sequence SQ_YETKI
minvalue 1
maxvalue 9999999999999999999999999999
start with 221
increment by 1
cache 20;

Emilie

Confirmation de:

Si le modèle essaie d'abord de bloquer


[Key]
[DatabaseGenerated/DatabaseGeneratedOption.None/]
public Int64 PolicyID { get; set; }

Damien

Confirmation de:

Je sais qu'un peu tard, mais comment j'ai réussi à le réparer.

J'ai allumé ces attributs dans votre int PK dans leurs modèles. /céder la place à ma graine dans configuration.cs an/
[Key]


[DatabaseGenerated/DatabaseGeneratedOption.None/]



Après avoir inséré ma graine, j'utilise l'objet SQL Server Explorer dans Visual Studio et déplacé à la table de ce modèle en cliquant avec le bouton droit de la souris sur la table et en appuyant sur 'View Designer'
https://i.stack.imgur.com/BZjZj.png

Vous trouverez ci-dessous le script créé pour créer cette table. Insérez cette commande immédiatement après la propriété principale.


IDENTITY/1,1/


https://i.stack.imgur.com/BWdq6.png

Appliquez le changement de script en appuyant sur le bouton 'Update' Présentation légèrement au-dessus du tableau /Coin gauche/

https://i.stack.imgur.com/rfH4w.png

Après avoir mis à jour la base de données, revenez à votre modèle et modifiez cet attribut:


[DatabaseGenerated/DatabaseGeneratedOption.None/]

to
[DatabaseGenerated/DatabaseGeneratedOption.Identity/]


Enregistrer, ajouter la migration, puis mettre à jour la base de données.

Chaque fois que vous insérez, cela augmentera maintenant en fonction de ce que vous avez souligné dans le script. IDENTITY.

Pour répondre aux questions, connectez-vous ou registre