LINQ to SQL - - PullRequest
       78

LINQ to SQL -

5 голосов
/ 26 октября 2008

Я пытаюсь использовать 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-полю, но это не подходит для моего случая.

Может ли кто-нибудь пролить свет на эту ситуацию для меня? Какую невероятно очевидную вещь я здесь упускаю?

Большое спасибо.
Пол Преуветт

Ответы [ 14 ]

0 голосов
/ 26 октября 2008

Да, я читал это и другие посты, но всегда кажется, что кто-то подключается к полю, у которого просто есть уникальное ограничение. Или в случае этого парня (который звучит точно так же, как у меня), он не получил решения.

Вот родительская таблица:

tblResponseTable definition (which maps to CodebookVersion)
COLUMN_NAME TYPE_NAME
id  int identity
versionTag  nvarchar
responseVersionTag  nvarchar

versionTag имеет уникальное противопоставление, но он не представлен нигде, что я могу видеть в материалах LINQ-to-SQL - и поскольку в базу данных ничего не попадает ... все еще застрял.

0 голосов
/ 26 октября 2008

Чтобы попытаться сузить преступника.

Вы пытались заменить анонимный словарь чем-то вроде:

ResponseCode rc = new ResponseCode();

rc.SurveyQuestName = "Q11";
rc.Code = 3;
rc.Description = "Yet Another Code";

У меня еще не получилось по-настоящему работать с .NET 3.5 (дневная работа по-прежнему все 2.0), поэтому мне интересно, есть ли проблема с передачей данных с использованием анонимного словаря (случаи не соответствуют Столбцы SQL для одного).

0 голосов
/ 26 октября 2008

Этот блок:

codebookVersion.ResponseCodes.Add(rc);
db.SubmitChanges(); //exception gets thrown here

Можете ли вы попробовать InsertOnSubmit вместо Add? т.е.

codebookVersion.ResponseCodes.InsertOnSubmit(rc);

Я думаю, Add не предназначен для вставки записей, если память мне не изменяет InsertOnSubmit является тем, чтобы использовать.

0 голосов
/ 26 октября 2008
ResponseCode rc = new ResponseCode()
    {
       SurveyQuestionName = "Q11",
       Code = 3,
       Description = "Yet another code"
    };

и

INSERT INTO tblResponseCode 
(responseCodeTableId, surveyQuestionName, code, description)
VALUES (13683, 'Q11', 3, 'Yet another code')

Не совпадают, вы не передаете ссылку на внешний ключ. Теперь, я огромный n00b в LINQ2SQL, но держу пари, что LINQ2SQL недостаточно умен, чтобы сделать это за вас, и ожидает, что это будет первым параметром анонимного словаря, и пытается преобразовать строку в целое число. .

Просто несколько идей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...