56 votes

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

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

Je suis venu à un problème sur l'insertion de 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: {"Impossible d'insérer la valeur NULL dans la colonne 'Id', table 'TestDB.dbo.BOB"; la colonne n'autorise pas les valeurs null. INSERTION échoue.\r\nle instruction a été arrêtée."}

La Table a juste 1 champ d' Id int not NULL qui est la clé primaire et n'est pas une auto incrémenté Id.

Sur la création du DataContext j'ai cette configuration, qui oui ne me faire virer.

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

J'ai aussi pré-remplis ce tableau, et ensuite à travers le débogueur été en mesure de via regarder la charge jusqu'à ce que BOB objet... donc, je suis vraiment perplexe, comme pour être en mesure de charger mon BOB montre que tout va bien... cependant, au moment de l'insertion d'un nouveau, qu'il se bloque...

79voto

sitem00n Points 241

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

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

ce n'est PAS une auto généré, nombre

puis j'ai frappé la même erreur.

EF Premier Code CTP5

après avoir appliqué ce:

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

ensuite, il sera.

33voto

Lanceomagnifico Points 659

Je suis à l'aide d'EF 4.1, le Premier Modèle et suis tombé sur ce problème. Voici comment je l'ai résolu:

Lorsque vous utilisez le Concepteur de Modèle de surface, lorsque vous créez une Entité, vous devez définir une " Clé " de la propriété, la valeur par défaut de l'Id, int32.

Dans ma situation, j'ai choisi d'utiliser le Guid pour l'Id, alors je serais le commutateur de la int32 de Guid. Mais si vous examinez cette Id après la création de l'entité, j'ai vu que l'Id est 'StoreGeneratedPattern' a 'l'identité sélectionnée. Au début, je ne pensais pas que c'était un problème, mais lorsque j'ai examiné le SQL utilisé pour les insérer dans la base de données, c'était un peu étrange qu'elle n'était pas de l'envoi de ma carte d'identité. Frustrant!

Mais une fois que je suis revenu en arrière et a changé le 'StoreGeneratedPattern' de 'l'identité' à 'none', regénérées à la db et reconstruit le projet, de cet étrange {"Impossible d'insérer la valeur NULL dans la colonne 'Id', table 'TestDB.dbo.BOB"; la colonne n'autorise pas les valeurs null. INSERTION échoue.\r\nle instruction a été arrêtée."} cessé de qui se passe.

FYI - lors de la visualisation sql certains de plus, il semble que si vous avez de 'l'identité choisie pour "StoreGeneratedPattern', EF enregistre l'objet de la db (sans Id), puis immédiatement extrait de retour à l'identité et l'enregistre de nouveau à votre objet. c'est à dire de ce choix de 'StoreGeneratedPattern' s'appuie sur la db pour générer votre carte d'identité, PAS de votre code!

31voto

GenericTypeTea Points 27689

Avez-vous essayé de spécifier explicitement l' StoreGeneratedPattern?

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

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

3voto

Jake Points 111

Il m'est arrivé quand j'ai eu une clé primaire manquante sur le très respecté de la colonne (la colonne d'identité) dans la base de données du schéma. J'ai exporté les données entre les serveurs SQL, à l'aide de SSMS outil d'Exportation et la création d'une nouvelle base de données, mais je ne savais pas que c'est l'exportation uniquement les données, sans clés.

0voto

Jeff Points 66

Pourriez-vous poster votre code C# pour le BOB type? Plus précisément, quel est le type de la propriété "Id"? Par convention, le Premier Code en fera si elle appelé Id ou Nom + Id qui est aussi un "int" une identité. Cependant, il n'est pas clair pour moi pourquoi vous obtenez une exception dans ce cas donc je voudrais voir la définition de votre classe.

Pour vos autres questions, à l'aide de plusieurs DbContext types dans un projet est entièrement pris en charge et devrait fonctionner très bien avec CTP4 et CTP5.

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