2011-10-22 16 views
28

Questo è il mio codice, molto semplice ...codice prima - Impossibile inserire il valore NULL nella colonna 'Id'

var newUser = new User(); 
     newUser.Id=id; 
     newUser.Email = email; 
     this.DataContext.Set<User>().Add(newUser); 
     this.DataContext.SaveChanges(); 

L'errore che ottengo è una SQLException in this.DataContext.SaveChanges(); affermando che:

Impossibile inserire il valore NULL nella colonna "Id", tabella "xxxxx.dbo.Users"; la colonna non consente null. INSERT fallisce.

ho debug e ha scoperto che c'è un valore in Id & e-mail nel newUser a this.DataContext.Set<User>().Add(newUser);

Se questo è il caso, come viene il valore diventando nulla?

L'analisi dello stack di errore:

[DbUpdateException: An error occurred while updating the entries. See the inner exception for details.] 
    System.Data.Entity.Internal.InternalContext.SaveChanges() +204 
    System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +23 
    System.Data.Entity.DbContext.SaveChanges() +20 

non sono stato in grado di comprendere o risolvere questo ....

Sarebbe sinceramente apprezzare alcun aiuto in questo ...

Saluti Arnab

Soluzione

Ok, grazie a Ladislav per indicarmi la giusta direzione: Aggiunta l'attributo [DatabaseGenerated(DatabaseGeneratedOption.None)] risolto il problema.

+0

Qual è il tipo di ID? Potrebbe essere che qualcosa stia andando storto nel generare la chiave nel database? –

+0

type è bigint in sqlserver, in User class è lungo .. Anche quando utilizzo il normale framework di entità senza codefirst, funziona anche – Arnab

+0

Il parametro id è anche lungo – Arnab

risposta

7

Ho avuto lo stesso problema, ho trovato la tua domanda e ho notato questa domanda Entity Framework 4.1 code-first KeyAttribute as non-identity column (che ha un attributo che ha risolto il mio problema).

Se si definisce l'utente come:

public class User 
{ 
    [DataMember, Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public long ID { get; set; } 

    [DataMember] 
    public string Email { get; set; } 
} 

La chiave qui sta mettendo gli attributi:

  • chiave
  • DatabaseGenerated

nella colonna ID. Apparentemente il problema che stiamo combattendo è che Entity Framework prevede di default di inserire inserti con chiavi come identità.

+0

Questo mi ha aiutato grazie! –

21

In riferimento a this post sembra che il framework di entità si aspetti per impostazione predefinita che si inserisce nella colonna Identity.

per risolvere questo tentativo:

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

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

o decorare la vostra chiave nella POCO con:

[Key] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] //Fixed typo 
public Int64 PolicyID { get; set; } 
+0

Questa dovrebbe essere la risposta accettata. – Rap

+1

Credo che il flag enum per quell'attributo sia "DatabaseGeneratedOption" e non "DatabaseGenerationOption" –

+0

Ha funzionato anche per me qualcuno può spiegare perché è successo come questo attributo ha risolto il problema. – Shrivallabh

2

Ho fissato questo impostando StoreGeneratedPattern sulle proprietà delle colonne per Computed.

Passo dopo passo qui sotto:

  1. Aprire l'EDMX (doppio clic in Visual Studio)
  2. Fare clic destro sulla colonna che causa il problema, selezionare Proprietà.
  3. Modifica StoreGeneratedPattern per essere Computed.

From the IDE enter image description here

Speranza che aiuta qualcuno.

+0

La domanda è specifica per codice prima – Suamere

Problemi correlati