Sto tentando di utilizzare LINQ per inserire un record in una tabella figlio e io sono ricevere un errore "Cast specificato non valido" che ha qualcosa da fare con le chiavi interessate. La traccia dello stack è:LINQ to SQL -
Messaggio: Il cast specificato non è valido.
Tipo: System.InvalidCastException Fonte: System.Data.Linq TargetSite: booleani TryCreateKeyFromValues (System.Object [], V ByRef) HelpLink: null Stack: a System.Data.Linq.IdentityManager.StandardIdentityManager .SingleKeyManager
2.TryCreateKeyFromValues(Object[] values, V& v) at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache
2.Find (Object [] valori chiave) a System.Data.Linq.IdentityManager.StandardIdentityManager.Find (metatipo tipo, dell'oggetto []) a valori- System.Data.Linq.CommonDataServices.GetCachedObject (metatipo type, Object [] keyValues) a System.Data.Linq.ChangeProcessor.GetOtherItem (MetaAsso ciazione assoc, Object esempio) in System.Data.Linq.ChangeProcessor.BuildEdgeMaps() a System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode failureMode) a System.Data.Linq.DataContext.SubmitChanges (ConflictMode failureMode) a System.Data.Linq.DataContext.SubmitChanges()(.....)
Questo errore viene gettata sul seguente codice:
ResponseDataContext db = new ResponseDataContext(m_ConnectionString);
CodebookVersion codebookVersion = db.CodebookVersions.Single(cv => cv.VersionTag == m_CodebookVersionTag);
ResponseCode rc = new ResponseCode()
{
SurveyQuestionName = "Q11",
Code = 3,
Description = "Yet another code"
};
codebookVersion.ResponseCodes.Add(rc);
db.SubmitChanges(); //exception gets thrown here
Le tabelle in questione hanno una relazione FK tra le due.
La colonna della tabella padre è chiamata 'id', è il PK ed è di tipo: INT NOT NULL IDENTITY
La colonna della tabella figlio è chiamata 'responseCodeTableId' ed è di tipo: INT NOT NULL.
codebookVersion (classe genitore) associa al tavolo tblResponseCodeTable
responseCode (ChildClass) mappe a tavola tblResponseCode
Se eseguo direttamente SQL, funziona. per esempio.
INSERT INTO tblResponseCode
(responseCodeTableId, surveyQuestionName, code, description)
VALUES (13683, 'Q11', 3, 'Yet another code')
Gli aggiornamenti della stessa classe funzionano correttamente. per esempio.
codebookVersion.ResponseCodes[0].Description = "BlahBlahBlah";
db.SubmitChanges(); //no exception - change is committed to db
Ho esaminato la variabile, rc, dopo l'operazione .Add() e lo fa, infatti, ricevo la corretta responseCodeTableId, proprio come ci si aspetta dal momento che sto aggiungendolo a quella raccolta.
tblResponseCodeTable's full definition:
COLUMN_NAME TYPE_NAME
id int identity
responseCodeTableId int
surveyQuestionName nvarchar
code smallint
description nvarchar
dtCreate smalldatetime
dtCreate ha un valore predefinito GetDate().
L'unico altro po 'di informazioni utili che mi viene in mente è che non SQL è mai provato a fronte del database, in modo da LINQ soffia fino prima ancora tentativi (da qui l'errore non essendo uno SqlException). Ho profilato e verificato che nessun tentativo è fatto per eseguire alcuna dichiarazione sul database.
Ho letto e ho visto il problema quando si ha una relazione con un campo non PK, ma questo non si adatta al mio caso.
Qualcuno può far luce su questa situazione per me? Che cosa incredibilmente ovvia mi manca qui?
Molte grazie.
Paul Prewett
Il problema simile è discusso qui, risolto i miei problemi: http://stackoverflow.com/questions/4801364/specified-cast-is-not-valid-error-when-saving- linq-to-sql-entity –