2010-12-14 3 views
44

Im mit EF CTP 4. Ich habe eine einfache Konsole App (zu Testzwecken), die EF verwendet, um einige Daten einzufügen in eine SQL-Datenbank.Entity Framework CTP 4. "Kann den Wert NULL nicht in Spalte einfügen" - Obwohl es keinen Nullwert gibt

ich zu einem Problem gekommen sind, wo durch auf den Punkt Einfügen

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

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

Es wirft den Fehler: { "den Wert NULL nicht in der Spalte‚Id‘einfügen, Tabelle‚TestDB.dbo.BOB‘ erlauben Spalte nulls nicht INSERT ausfällt \ r \ nDie Anweisung wurde beendet "}

die Tabelle enthält nur 1 Feld Id int NOT NULL die die Primärschlüssel ist, und ist nicht ein;... automatisch inkrementierte Id.

Bei der Erstellung des DataContext habe ich diese Konfiguration, die ja ausgelöst wird.

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

Ich habe auch diese Tabelle im Vorhinein gefüllt und dann das BOB-Objekt über Uhr durch den Debugger der Lage gewesen, Last ... also bin ich wirklich ratlos, wie mein BOB in der Lage zu laden zeigt an, dass alles richtig ist ... aber beim Einfügen eines neuen stürzt es ab ...

+1

Vielleicht möchten Sie es in [EF CTP 5] versuchen (http://weblogs.asp.net/scottgu/archive/2010/12/08/announcing-entity-framework-code-first-ctp5- release.aspx) –

+1

möchte ich auch erwähnen, dass ich auch eine Verbindung zu einem anderen DataContext seperat habe, der mit einer separaten Datenbank kommuniziert. Die Idee ist, ich würde die Daten von dort auswählen und in mein Bob-Objekt konvertieren und es in die andere DB einfügen. verursacht die Verwendung von 2 verschiedenen DataContexts in der gleichen Lösung Probleme ??? –

+0

Auf CTP5 aktualisiert, aber wie ich erwartet habe, habe ich mein Problem nicht behoben. –

Antwort

28

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"); 
+10

haben das gleiche Problem mit CTP 5 hier ist die Syntax: modelBuilder.Entity () .HasKey (p => p.Id) .Property (p => p.Id) .HasDatabaseGenerationOption (DatabaseGenerationOption.None); modelBuilder.Entity () .ToTable ("BOB"); –

1

Können Sie Ihren C# -Code für den BOB-Typ posten? Was ist der Typ der "Id" -Eigenschaft? Per Konvention macht Code First jede Eigenschaft namens Id oder TypeName + Id, die auch eine "int" ist. Es ist mir jedoch nicht klar, warum Sie in diesem Fall eine Ausnahme erhalten, daher würde ich gerne Ihre Klassendefinition sehen.

Bei anderen Fragen wird die Verwendung mehrerer DbContext-Typen in einem Projekt vollständig unterstützt und sollte mit CTP4 und CTP5 problemlos funktionieren.

59

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

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

Dies ist nicht eine automatische generierte Nummer

dann traf ich den gleichen Fehler.

EF-Code Erste CTP5

danach gelten:

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

dann wird es funktionieren.

+6

Ich stimme nicht zu, das ist eine hässliche Lösung. Diese IMO ist viel schöner als oben. Die Anmerkungen helfen wirklich, die Dinge lesbar zu machen! – Yablargo

+3

Sie können es auch in der Karte tun: 'this.Property (t => t.id) .HasColumnName (" id "). HasDatabaseGeneratedOption (DatabaseGeneratedOption.None);' – Gaui

+0

Dies löste ein ähnliches Problem für mich. IMO, das ist keine hässliche Lösung. –

22

Ich verwende EF 4.1, Model First und stieß auf dieses Problem. Hier ist, wie ich es gelöst habe:

Wenn Sie die Model Designer-Oberfläche verwenden, müssen Sie beim Erstellen einer Entität eine Schlüsseleigenschaft definieren, die standardmäßig auf Id, int32 festgelegt wird.

In meiner Situation habe ich Guids für die ID gewählt, also würde ich den Int32 zu Guid wechseln. Aber wenn Sie diese Id untersuchen, nachdem Sie die Entity erstellt haben, habe ich gesehen, dass die 'StoreGeneratedPattern' der Id 'Identität' ausgewählt hat.Zuerst dachte ich nicht, dass das ein Problem war, aber als ich das SQL untersuchte, das verwendet wurde, um es in die Datenbank einzufügen, war es ein bisschen komisch, dass es meine ID nicht sendete. Frustrierend!

Aber sobald ich ging zurück und änderte die ‚StoreGeneratedPattern‘ von ‚Identität‘ auf ‚none‘, regeneriert die Db und baute das Projekt, dieses seltsame { "Kann nicht den Wert NULL in Spalte‚Id‘einfügen, Tabelle 'TestDB.dbo.BOB'; Spalte erlaubt keine Nullwerte. INSERT schlägt fehl. \ R \ nDie Anweisung wurde beendet. "} wurde gestoppt.

FYI - beim Anzeigen der SQL einige mehr scheint es, dass, wenn Sie "Identität" für "StoreGeneratedPattern" gewählt haben, speichert die EF das Objekt in die db (sans Id), dann holt sofort die Identität und speichert diese zurück zu deinem Objekt. d. h. diese Wahl für "StoreGeneratedPattern" beruht auf der Datenbank, um Ihre ID NICHT Ihren Code zu generieren!

+0

Yup! Danke dafür.Ich benutzte einen Nicht-Int32 als Schlüssel und EF überschrieb, was ich gerade dort geschrieben hatte. Ich werde fortan mehr auf StoreGeneratedPattern achten! – DanTheMan

3

Es ist mir passiert, als ich einen Primärschlüssel in der respektierten Spalte (die Identitätsspalte) im DB-Schema fehlte. Ich exportierte Daten zwischen SQL-Servern, mithilfe von SSMS-Export-Tool und Erstellen einer neuen Datenbank, aber nicht erkannt, dass es nur die Daten exportiert, ohne Schlüssel.

0

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

Ich hatte diesen Fehler heute, weil ich zwei verschiedene Instanzen desselben DataContext verwendet habe. Ich habe ein neues Modell mit einigen Eigenschaften erstellt - Werte für diese Eigenschaften wurden von der Datenbank mit einer Instanz der DataContext geladen, dann versuchte ich, dieses neu erstellte Modell in die Datenbank zu schieben, die zuerst Add() und dann SaveChanges() auf einer anderen Instanz der DataContext. Nachdem ich begonnen habe, dieselbe Instanz zu verwenden, um sowohl die Werte für die Eigenschaften abzurufen als auch das neue Objekt tatsächlich hinzuzufügen und zu speichern, fing alles an zu arbeiten.

Verwandte Themen