Я пытаюсь использовать LINQ для вставки записи в дочернюю таблицу, и я
получение ошибки «Указанное приведение неверно», в которой есть что
ключи задействованы. Трассировка стека:
Сообщение: указанное приведение недействительно.
Тип: 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 (метатип
тип, Object [] keyValues) в
System.Data.Linq.ChangeProcessor.GetOtherItem (MetaAssociation
Assoc, экземпляр объекта) в
System.Data.Linq.ChangeProcessor.BuildEdgeMaps ()
в
System.Data.Linq.ChangeProcessor.SubmitChanges (ConflictMode
faultMode) в
System.Data.Linq.DataContext.SubmitChanges (ConflictMode
faultMode) в
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). Я профилирован и проверен
что не делается никаких попыток выполнить какие-либо операторы в базе данных.
Я прочитал и увидел проблему, когда у вас есть отношение к не-PK-полю, но это не подходит для моего случая.
Может ли кто-нибудь пролить свет на эту ситуацию для меня? Какую невероятно очевидную вещь я здесь упускаю?
Большое спасибо.
Пол Преуветт