2016-03-30 9 views
7

Quindi sto provando a fare una semplice aggiunta di una voce al mio db in azzurro, ma per qualche motivo il db non sta generando il mio PK per la voce.
Di seguito è riportato tutto il codice utilizzato per creare il db e fare la voce.
Questo è il EF 6.1 su una console appImpossibile inserire il valore NULL nella colonna "MaintenanceId", tabella "<tableName>"; la colonna non consente null. INSERT fallisce EF 6.1

Contesto

public BlizzardDbContext() : base("AzureSqlDb") 
{ 
} 

public DbSet<Maintenance> Maintenances { get; set; } 

Modello

public class Maintenance 
{ 
    public Maintenance() 
    {} 

    public Maintenance(DateTime start, DateTime end, string info) 
    { 
     Start = start; 
     End = end; 
     Info = info; 
    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int MaintenanceId { get; set; } 

    public DateTime? Start { get; set; } 

    public DateTime? End { get; set; } 

    public string Info { get; set; } 
} 

prova che non è riuscito a salvare le modifiche

var context = new BlizzardDbContext(); 
context.Maintenances.Add(new Maintenance() {Start = DateTime.Now, End = DateTime.Now, Info = ""}); 
context.SaveChanges(); 

So che può sembrare così semplice , ho usato EF alcune volte prima ma non riesco a capire cosa sia andando male questa volta e qui sta l'errore

"Impossibile inserire il valore NULL nella colonna 'MaintenanceId' tabella' .dbo.Maintenances'; la colonna non consente null. INSERT fallisce \ dichiarazione r \ nIl è stato terminato "

enter image description here

Aggiornamento:.. Abbiamo finito per fissare questo eliminando il db e ricreare, credo che ci fosse qualcosa di strano sta succedendo con EF, è non è stato l'aggiornamento del db con la migrazione correttamente in quanto dopo la ricreazione è la colonna è stata quindi impostato per essere Identità

+1

Il messaggio di errore dice quasi esattamente * qual è il problema *. O non stai passando il valore perché hai detto a EF che il database è supposto fornirlo, o stai passando il valore perché la colonna non è una colonna di identità. In questo caso, la colonna non è una colonna Identity (o è stata disattivata). –

+0

@ErikPhilips Sì, lo capisco, ma come si può vedere dal mio modello, l'annotazione dei dati (ho anche provato con API fluente) dice al db che si tratta del collum PK. questo è l'SQL generato dall'accesso al col in SQL Server Object Explorer 'ALTER TABLE [dbo]. [Manutenzioni] ADD CONSTRAINT [PK_dbo.Mavensioni] PRIMARY KEY CLUSTERED ([MaintenanceId] ASC);' – Toxicable

+1

Che è un errore di SQL Server .** SQL Server ** ti dice che non è una colonna Identity indipendentemente da come hai configurato EF. –

risposta

2

Basta verificare se l'ID di manutenzione è la chiave di identità o meno nel DB. Se non lo è o non sono sicuro che si può provare sotto l'opzione

cambiamento

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

a

[DatabaseGenerated(DatabaseGeneratedOption.None)] 

.None - "Il database non genera valori" che significa

+0

Oh wow, ok quindi impostarlo su Nessuno ha funzionato, sono così confuso, se non lo includo otterrò degli errori ma quando sono arrivato a null funziona? come MaintenanceId come PK ancora – Toxicable

+1

Puoi trovare la risposta qui :) http://stackoverflow.com/questions/15567886/why-does-the-databasegeneratedoption-none-exist –

+0

Avevo bisogno di farlo al contrario, come il mio PK non è stato generato automaticamente. Quando si passa nel mio modello Entity con il KEY popolato, il messaggio di errore era che la proprietà era NULL .. quando NON era nulla. Quindi ho dovuto usare '[DatabaseGenerated (DatabaseGeneratedOption.None)]' e ha funzionato. – ppumkin

0

Accedere al database e verificare che il MaintenanceId è infatti auto-generando la chiave. EF supports this, e ho il sospetto che qualcosa di divertente è successo durante la migrazione, se lo hai usato, o durante la costruzione del tavolo

Inoltre, assicurarsi di non aver disabilitato il tracciamento degli oggetti nella classe DbContext. L'impostazione predefinita è attivata, quindi, a meno che non lo disabiliti esplicitamente, non devi preoccuparti di quello :)

+0

Non posso accedere al db per quanto ne so dato che si tratta di un cloud di Azure, tuttavia posso accedervi tramite VS Object Explorer SQL che conferma che è (PK, int, not null) con il codice che lo ha creato in il commento di cui sopra – Toxicable

+0

È possibile accedere al DB cloud finché si ha accesso al portale azzurro, è possibile utilizzare SQL Server Management Studio se lo si desidera. Basta puntare all'URL del server e usare il nome utente/password. Forse dovresti provare a rimuovere il secondo attributo sulla tua chiave (DatabaseGenerated) e vedere se questo ti aiuta? Non l'ho mai usato da solo, e ancora ottengo gli add. –

+0

Ok quindi, errore mio prima, pensavo che l'impostazione di 'DatabaseGeneratedOption.None' fosse corretta, ma ho dimenticato che il valore predefinito di' int' è 0 che lo inserisce nel db, quindi non lo è. Quindi dopo aver fatto quello che hai detto ho controllato il DB e quella colonna non sembra essere una Identity, ma il PK non è l'Identity, hai qualche idea su come risolvere questo problema? preferisci il codice prima – Toxicable

Problemi correlati