web-dev-qa-db-de.com

Entity Framework CTP 4. "Der Wert NULL kann nicht in die Spalte eingefügt werden" - Auch wenn kein NULL-Wert vorhanden ist

Ich verwende EF CTP 4. Ich habe eine einfache Konsolen-App (zu Testzwecken), die EF zum Einfügen von Daten in eine SQL-Datenbank verwendet.

Ich bin zu einem Problem gekommen, indem Sie den Artikel einfügen 

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

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

Der Fehler wird ausgegeben: {"Der Wert NULL kann nicht in die Spalte 'Id', Tabelle 'TestDB.dbo.BOB' eingefügt werden; die Spalte lässt keine Nullen zu. INSERT schlägt fehl.\R\nDie Anweisung wurde beendet."}

Die Tabelle enthält nur ein Feld von Id, wobei NOT NULL der Primärschlüssel ist, und es ist nicht eine automatisch inkrementierte ID.

Bei der Erstellung des DataContext habe ich diese Konfiguration, die ja gefeuert wird.

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

Ich habe diese Tabelle auch vorgefüllt und dann durch den Debugger in der Lage, dieses BOB-Objekt über watch zu laden ... also bin ich wirklich verblüfft, denn meine BOB laden zu können, zeigt, dass alles richtig ist ... aber beim Einfügen eines neuen stürzt es ab ...

48
Secret Squirrel

Haben Sie versucht, die StoreGeneratedPattern explizit anzugeben?

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

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

ich habe das gleiche Problem hier und es ist wirklich eine hässliche Lösung.

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

dies ist KEINE automatisch generierte Nummer

dann traf ich den gleichen Fehler.

EF-Code Erstes CTP5

danach bewerben Sie sich:

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

dann wird es klappen.

66
sitem00n

Ich verwende EF 4.1, Model First und bin auf dieses Problem gestoßen. So habe ich es gelöst:

Wenn Sie die Oberfläche des Modell-Designers verwenden, müssen Sie beim Erstellen einer Entität eine 'Key'-Eigenschaft definieren. Die Standardeinstellung ist Id, int32.

In meiner Situation habe ich mich entschieden, Guids für die Id zu verwenden, also würde ich das int32 auf Guid umstellen. Wenn Sie diese ID jedoch prüfen, nachdem Sie die Entität erstellt haben, habe ich gesehen, dass für 'StoreGeneratedPattern' der Id 'Identität' ausgewählt wurde. Anfangs dachte ich nicht, dass dies ein Problem war, aber als ich die zum Einfügen in die Datenbank verwendete SQL untersuchte, war es etwas komisch, dass meine ID nicht gesendet wurde. Frustrierend!

Aber als ich zurückging und das 'StoreGeneratedPattern' von 'Identity' in 'None' änderte, das DB neu generierte und das Projekt neu erstellte, kann dieser seltsame {"Wert NULL nicht in die Spalte 'Id', Tabelle 'TestDB.dbo .BOB '; Spalte erlaubt keine Nullen. INSERT schlägt fehl.\R\nDie Anweisung wurde abgebrochen. "} Wurde nicht mehr ausgeführt.

Zu Ihrer Information: Wenn Sie sich die SQL-Version noch etwas genauer ansehen, scheint es, als wenn Sie "Identity" für "StoreGeneratedPattern" ausgewählt haben, die EF das Objekt in der Datenbank (sans Id) speichert, dann sofort die Identität zurückbringt und diese zurück in Ihr Objekt speichert. Diese Wahl für 'StoreGeneratedPattern' hängt von der Datenbank ab, um Ihre ID zu erzeugen,NICHTIhren Code!

26
Lanceomagnifico

Es passierte für mich, als mir ein Primärschlüssel in der respektierten Spalte (der Identitätsspalte) im Schema der Datenbank fehlte. Ich habe Daten zwischen SQL-Servern mit dem SSMS-Exporttool exportiert und eine neue Datenbank erstellt, wusste aber nichts dass es nur die Daten ohne Schlüssel exportiert.

3
Jake

Ich hatte eine ähnliche Situation, aber in meinem Fall half es auch nicht, Identity auf off zu setzen.

Das Problem war mit dem Primärschlüssel verbunden, den ich in meinem Entitätsmodell nicht hinzugefügt habe.

Hier ist das Skript, mit dem das Modell erstellt wurde:

 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
 )

Der C # -Code für oben lautet: 

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

Hier ist auch eine Erklärung dafür. 

0

Ich weiß, dass diese Frage irgendwie veraltet ist und bereits eine akzeptierte Lösung gefunden wurde, aber ich dachte, es wäre nützlich, wenn ich meine Ergebnisse teilen würde.

Ich hatte diesen Fehler heute, weil ich zwei verschiedene Instanzen derselben DataContext verwendet habe. Ich habe ein neues Modell mit einigen Eigenschaften erstellt. Die Werte für diese Eigenschaften wurden mit einer Instanz von DataContext aus der Datenbank geladen. Dann versuchte ich, das neu erstellte Modell in die Datenbank zu verschieben, die zuerst Add() und dann SaveChanges() in einer anderen Instanz des aufgerufen wurde DataContext. Nachdem ich angefangen hatte, dieselbe Instanz zu verwenden, um sowohl die Werte für die Eigenschaften zu erhalten als auch das neue Objekt tatsächlich hinzugefügt und gespeichert zu haben, begann alles zu funktionieren. 

0

Sie könnten auch verwenden

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

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