Estoy tratando de usar LINQ para insertar un registro en una tabla secundaria y estoy recibiendo un error "Cast especificado no es válido" que tiene algo que ver con las claves involucradas w/ . El seguimiento de la pila es:LINQ to SQL -
Mensaje: La conversión especificada no es válida.
Tipo: System.InvalidCastException Fuente: System.Data.Linq TargetSite: booleanas TryCreateKeyFromValues (System.Object [], V ByRef) HelpLink: null Stack: en System.Data.Linq.IdentityManager.StandardIdentityManager .SingleKeyManager
2.TryCreateKeyFromValues(Object[] values, V& v) at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache
2.Find (Object [] keyValues) en System.Data.Linq.IdentityManager.StandardIdentityManager.Find (MetaType tipo, objeto [] keyValues) en System.Data.Linq.CommonDataServices.GetCachedObject (MetaType tipo, Object [] keyValues) en System.Data.Linq.ChangeProcessor.GetOtherItem (MetaAsso ciación Assoc, objeto de instancia) en System.Data.Linq.ChangeProcessor.BuildEdgeMaps() en System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode failureMode) en System.Data.Linq.DataContext.SubmitChanges (ConflictMode failureMode) en System.Data.Linq.DataContext.SubmitChanges()(.....)
Este error se está lanzando en el siguiente código:
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
Las tablas en cuestión tienen una relación FK entre las dos.
La columna de la tabla principal se llama 'id', es PK, y es del tipo: INT NOT NULL IDENTITY
La columna de la tabla hija se llama 'responseCodeTableId' y es del tipo: INT NOT NULL.
codebookVersion (clase padre) se asigna a la mesa tblResponseCodeTable
ResponseCode (ChildClass) se asigna a tblResponseCode mesa
Si ejecuto SQL directamente, funciona. p.ej.
INSERT INTO tblResponseCode
(responseCodeTableId, surveyQuestionName, code, description)
VALUES (13683, 'Q11', 3, 'Yet another code')
Las actualizaciones de la misma clase funcionan correctamente. p.ej.
codebookVersion.ResponseCodes[0].Description = "BlahBlahBlah";
db.SubmitChanges(); //no exception - change is committed to db
He examinado la variable, RC, después de la operación .Add() y lo hace, de hecho, recibo el responseCodeTableId adecuado, tal como me esperaba, ya que estoy añadiendo a la colección.
tblResponseCodeTable's full definition:
COLUMN_NAME TYPE_NAME
id int identity
responseCodeTableId int
surveyQuestionName nvarchar
code smallint
description nvarchar
dtCreate smalldatetime
dtCreate tiene un valor predeterminado de GetDate().
El único otro poco de información útil que se me ocurre es que ningún SQL se haya tratado contra la base de datos, por lo que LINQ es volar antes de que alguna vez intentos (de ahí el error de no ser un SqlException). He perfilado y verificado que no se intenta ejecutar ninguna declaración en la base de datos.
He leído y visto el problema cuando tienes una relación con un campo PK no, pero eso no se ajusta a mi caso.
¿Alguien puede arrojar algo de luz sobre esta situación para mí? ¿Qué cosa increíblemente obvia me estoy perdiendo aquí?
Muchas gracias.
Paul Prewett
Problema similar se discute aquí, resolvió mis problemas: http://stackoverflow.com/questions/4801364/specified-cast-is-not-valid-error-when-saving- linq-to-sql-entity –