Подтвердить что ты не робот

LINQ to SQL Основные вставки: добавление или добавление не связанного с сущностью исключения

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

using (SAASDataContext dc = new SAASDataContext())
{
    tblAssessment a2 = new tblAssessment();

    a2.AssessmentCentreId = centreId;
    a2.AttemptNumber = 1;

    dc.tblAssessments.InsertOnSubmit(a2);
    dc.SubmitChanges();

    CurrentAssessmentId = a2.AssessmentId;
}

Код компилируется, но выдает исключение ниже в строке dc.SubmitChanges();.

Исключение:

Была предпринята попытка присоединения или добавления объекта, который не является новым, возможно, был загружен из другого DataContext. Это не поддерживается.

Примечания: AssessmentCentreId является внешним ключом на tblCentre, centreId является действительным существующим идентификатором центра, ОценкиCentreId и AttemptNumber являются единственными невальными полями, все остальные столбцы допускают null.

У меня есть googled, но все результаты, похоже, относятся к людям, пытающимся присоединить объекты, вытащенные из другого отключенного DataContext. Я не делаю этого, поэтому я в тупике.

UPDATE:

Добавление

dc.DeferredLoadingEnabled = false;

в верхней части блока использования заставляет его работать, но я хотел бы знать, почему coz, о котором я не знаю, на данный момент достаточно развитой технологии, неотличимой от магии прямо сейчас:)

4b9b3361

Ответ 1

Проблема заключается в том, что объект Center не существует в контексте. Это в дБ, но не "в твоей руке" с а2. Попробуйте следующее:

a2.AssessmentCentre = dc.AssessmentCentres.SingleOrDefault(
    d=>d.AssessmentCentreId.Equals(centreId));

Объект AssessmentCentre будет существовать в контексте, что означает, что с ним не будет проблем с присоединением к a2.

Ответ 2

Это тоже подшучивало. Я сделал некоторые поиски и нашел много путаницы и некоторые неряшливые обходные отношения относительно отдельных объектов. Затем я нашел хорошее решение для codeplex, которое решило немедленную проблему и значительно расширило функциональность linq2sql. Его небольшой класс, который действительно легко реализовать и формирует EntityBase для ваших проектов dbml.

Вот официальное описание и ссылка. LINQ to SQL Entity Base - простой базовый класс, который в первую очередь предназначен для поддержки LINQ to SQL в отключенном виде, что является одним из недостатков технологии LINQ to SQL в настоящее время. Это очень полезно в среде n-уровня, распределенной или ASP.NET, где отключена функциональность.

http://linq2sqleb.codeplex.com/

Надеюсь, это поможет любому, кто имеет подобное.

Джером Вернон

Ответ 3

Если это единственные непустые столбцы, где первичный ключ? Для LINQ to SQL требуется первичный ключ для вставки данных. Если вы используете оценочный центр самостоятельно или вместе с AttemptNumber в качестве составного, вы уверены, что не пытаетесь вставить дубликат?