Я пытаюсь использовать LINQ, чтобы вставить запись в дочернюю таблицу, а я - , получив ошибку «Указанный приведение недействителен», которая имеет что-то делать w/ связанные ключи. Трассировка стека:LINQ to SQL -
Сообщение: Указанный приказ недействителен.
Тип: System.InvalidCastException Источник: System.Data.Linq TargetSite: булевы TryCreateKeyFromValues (System.Object [], V ByRef) HelpLink: нуль Стек: в System.Data.Linq.IdentityManager.StandardIdentityManager .SingleKeyManager
2.TryCreateKeyFromValues(Object[] values, V& v) at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache
2.Find (Object [] KeyValues) при System.Data.Linq.IdentityManager.StandardIdentityManager.Find (метатип типа, Object [] KeyValues) при System.Data.Linq.CommonDataServices.GetCachedObject (метатип type, Object [] keyValues) в System.Data.Linq.ChangeProcessor.GetOtherItem (MetaAsso рирует ассоциативный, объект экземпляра) при System.Data.Linq.ChangeProcessor.BuildEdgeMaps() на System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode failureMode) на System.Data.Linq.DataContext.SubmitChanges (ConflictMode failureMode) в System.Data.Linq.DataContext.SubmitChanges()(.....)
Эта ошибка быть брошенными на следующий код:
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
Эти таблицы имеют отношения FK между двумя из них.
Столбец родительской таблицы называется «id», является PK и имеет тип: INT NOT NULL IDENTITY
Столбец дочерней таблицы называется «responseCodeTableId» и имеет тип: INT NOT NULL.
codebookVersion (родительский класс) карты для таблицы tblResponseCodeTable
responseCode (ChildClass) сопоставлена таблицы tblResponseCode
Если я выполнить SQL непосредственно, она работает. например
INSERT INTO tblResponseCode
(responseCodeTableId, surveyQuestionName, code, description)
VALUES (13683, 'Q11', 3, 'Yet another code')
Обновления к тому же классу работают нормально. например
codebookVersion.ResponseCodes[0].Description = "BlahBlahBlah";
db.SubmitChanges(); //no exception - change is committed to db
Я рассмотрел переменную, RC, после операции .Add() и это, действительно, получить надлежащее responseCodeTableId, так же, как я бы ожидать, так как я добавляю его в этой коллекции.
tblResponseCodeTable's full definition:
COLUMN_NAME TYPE_NAME
id int identity
responseCodeTableId int
surveyQuestionName nvarchar
code smallint
description nvarchar
dtCreate smalldatetime
dtCreate имеет значение по умолчанию GetDate().
Единственный бит полезной информации, которую я могу думать о том, что ни SQL не когда-нибудь пробовали с базой данных, поэтому LINQ взрывает прежде, чем она попыток (отсюда и ошибка не будучи SqlException). Я профилировал и проверял , что не предпринимаются попытки выполнить какие-либо инструкции в базе данных.
Я читал и видел проблему, когда у вас есть отношение к полю не ПК, но это не соответствует моему делу.
Может ли кто-нибудь пролить свет на эту ситуацию для меня? Какая невероятно очевидная вещь мне не хватает здесь?
Большое спасибо.
Пол Prewett
Аналогичная проблема обсуждается здесь, решены мои проблемы: http://stackoverflow.com/questions/4801364/specified-cast-is-not-valid-error-when-saving- linq-to-sql-entity –