2009-04-10 13 views
20

Ho cercato di inserire la riga nella tabella avere un RequestID colonna di identità (che è la chiave primaria pure)Impossibile eseguire Creare, aggiornare o cancellare le operazioni sulla Tabella perché non ha chiave primaria

HelpdeskLog logEntry = new HelpdeskLog { RequestBody = message.Body }; 
    if (attachment != null) 
     logEntry.Attachments = Helper.StreamToByteArray(attachment.ContentStream); 
    Database.HelpdeskLogs.InsertOnSubmit(logEntry); 

Ma il mio codice genera inevitabilmente seguente errore

Impossibile eseguire Creare, aggiornare o cancellare le operazioni nella tabella perché non ha chiave primaria.

nonostante colonna di chiave primaria esiste infatti

Questo è quello che ho cercato di fare:

  1. Per cercare nel debugger il valore della colonna di identità in cui inserire modello a oggetti. È 0
  2. Per inserire valori falsi manualmente (con SQL) nella tabella: funziona correttamente, valori di identità generati come previsto
  3. Per assicurare che SQLMetal abbia generato la tabella di tabella correttamente. Tutto OK, l'attributo della chiave primaria è generato correttamente

Tuttavia, nessuno dei due approcci ha aiutato. Qual è il trucco, qualcuno lo sa?

risposta

3

Poiché la tabella ha la chiave primaria in SQL Server, aggiungere nuovamente la tabella nel designer linq2sql.

In caso contrario, è possibile configurare quali proprietà fanno parte della chiave primaria a mano sul progettista.

4

Eliminare la tabella e quindi reinserirla. Devi assicurarti che ci sia un piccolo tasto vicino al campo prima di farlo. Ricompila il tuo progetto e tutto dovrebbe andare bene.

Solo perché è stato aggiornato il dabase non significa che il file DBML venga aggiornato in qualche modo automaticamente. Non, mi dispiace.

29

Ho avuto anche questo problema venire nel mio codice C#, e si rese conto che avevo dimenticato la designazione IsPrimaryKey:

[Table (Name = "MySessionEntries")] 
    public class SessionEntry 
    { 
    [Column(IsPrimaryKey=true)] // <---- like this 
    public Guid SessionId { get; set; } 
    [Column] 
    public Guid UserId { get; set; } 
    [Column] 
    public DateTime Created { get; set; } 
    [Column] 
    public DateTime LastAccess { get; set; } 
    } 

questo è necessario anche se la tabella di database (MySessionEntries, in questo caso) ha già definito una chiave primaria, dal momento che Linq non lo rileva automaticamente a meno che non si siano utilizzati gli strumenti linq2sql per estrarre le definizioni del database in Visual Studio.

+2

Grazie! Il mio codice sembrava un po 'diverso, ma il principale era lo stesso '[global :: System.Data.Linq.Mapping.ColumnAttribute (Storage =" _ ID ", DbType =" UniqueIdentifier NOT NULL ", IsPrimaryKey = true)]' ha fatto il trucco. –

Problemi correlati