web-dev-qa-db-fra.com

Entity Framework CTP 4. "Impossible d'insérer la valeur NULL dans la colonne" - Même s'il n'y a pas de valeur NULL

J'utilise EF CTP 4. J'ai une application de console simple (à des fins de test) qui utilise EF pour insérer des données dans une base de données SQL.

Je suis venu à un problème où en insérant l'élément 

using(var context = GetContext())
{
   BOB b = new BOB();
   b.Id = 1;

   context.Bobs.Add(b);
   context.SaveChanges();
}

Il génère l'erreur suivante: {"Impossible d'insérer la valeur NULL dans la colonne 'Id', table 'TestDB.dbo.BOB'; la colonne n'autorise pas la valeur NULL. INSERT échoue.\R\nL'instruction a été arrêtée."}

La table a juste 1 champ de Id int NOT NULL qui est la clé primaire et est not un identifiant auto incrémenté.

Lors de la création du DataContext, j'ai cette configuration, qui est effectivement activée.

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<BOB>().HasKey(b => b.Id);
    builder.Entity<BOB>().MapSingleType().ToTable("BOB");
}

J'ai également pré-rempli cette table et ensuite, par le biais du débogueur, de pouvoir regarder charger cet objet BOB ... je suis donc perplexe, car pouvoir charger mon BOB montre que tout va bien ... cependant lors de l'insertion d'un nouveau, il se bloque ...

48
Secret Squirrel

Avez-vous essayé de spécifier explicitement la StoreGeneratedPattern?

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
        .Property(p => p.Id)
            .StoreGeneratedPattern = StoreGeneratedPattern.None;

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
28
djdd87

j'ai le même problème ici et c'est vraiment une solution laide.

 [Key]
public Int64 PolicyID { get; set; }

ce n'est pas un nombre généré automatiquement

alors je frappe la même erreur.

Code EF premier CTP5

après avoir appliqué ceci:

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

alors ça va marcher.

66
sitem00n

J'utilise EF 4.1, Model First et j'ai rencontré ce problème. Voici comment je l'ai résolu:

Lorsque vous utilisez la surface du concepteur de modèle, lorsque vous créez une entité, vous devez définir une propriété 'Clé', définie par défaut sur Id, int32.

Dans ma situation, j'ai choisi d'utiliser Guids pour l'identifiant, donc je passerais de l'int32 à Guid. Mais si vous examinez cet identifiant après avoir créé l'entité, j'ai vu que "StoreGeneratedPattern" de l'identifiant avait "identité" sélectionnée. Au début, je ne pensais pas que c'était un problème, mais lorsque j'ai examiné le code SQL utilisé pour l'insertion dans la base de données, c'était un peu étrange de ne pas envoyer mon identifiant. Frustrant!

Mais une fois que je suis revenu et que j'ai changé le 'StoreGeneratedPattern' de 'identité' en 'aucun', régénéré la base de données et reconstruit le projet, cet étrange {"ne peut pas insérer la valeur NULL dans la colonne" Id ", table" TestDB.dbo La colonne .BOB 'n'autorise pas les valeurs NULL. INSERT échoue.\R\nL'instruction est terminée. "} A cessé de se produire.

FYI - après avoir visionné le sql un peu plus, il semble que si vous avez choisi "identité" pour "StoreGeneratedPattern", le EF enregistre l'objet dans la base de données (sans ID), puis le récupère immédiatement et le sauvegarde dans votre objet. C'est-à-dire que ce choix pour 'StoreGeneratedPattern' repose sur la base de données pour générer votre ID,PASvotre code!

26
Lanceomagnifico

Cela m'est arrivé lorsqu'une clé primaire manquait dans la colonne respectée (la colonne d'identité) dans le schéma de la base de données . J'ai exporté des données entre des serveurs SQL à l'aide de l'outil d'exportation SSMS et de la création d'une nouvelle base de données, mais je ne me suis pas rendu compte. qu'il exporte uniquement les données, sans clé.

3
Jake

J'ai eu une situation similaire, mais dans mon cas, même régler Identity sur off n'a pas aidé.

Le problème était lié à la clé primaire, que j’ai manquée d’ajouter à mon modèle d’entité.

Voici le script qui générait le modèle:

 CREATE TABLE [im].[SomeGroup]
 (
    [Id] INT NOT NULL IDENTITY(1,1), -- this is mandatory for EF
    [OtherGroupId] INT NOT NULL,
    [Title] NVARCHAR(512) NOT NULL
 )

Le code C # pour ci-dessus est: 

Insert(new SomeGroup
{
  // I'm not providing Id here, cause it will be auto-generated
  SomeGroupId = otherGroup.Id,
  Title = otherGroup.Title
});

Ici est aussi une explication de cela. 

0

Je sais que cette question est dépassée et qu’une solution acceptée a déjà été trouvée, mais j’ai pensé qu’il serait utile que je partage mes conclusions.

J'ai eu cette erreur aujourd'hui parce que j'utilisais deux instances différentes de la même DataContext. Je créais un nouveau modèle avec certaines propriétés - les valeurs de ces propriétés ont été chargées à partir de la base de données à l'aide d'une instance de DataContext, puis j'essayais d'insérer ce modèle nouvellement créé dans la base de données en appelant d'abord Add(), puis SaveChanges() sur une autre instance du DataContext. Après avoir commencé à utiliser la même instance pour obtenir les valeurs des propriétés et pour ajouter et enregistrer le nouvel objet, tout a commencé à fonctionner. 

0
Bashir Magomedov

Vous pouvez aussi utiliser

modelBuilder.Entity<BOB>()
    .HasKey(p => p.Id)
    .Property(p => p.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);

builder.Entity<BOB>().MapSingleType().ToTable("BOB");
0
Ajay Munugala