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, о котором я не знаю, на данный момент достаточно развитой технологии, неотличимой от магии прямо сейчас:)
Ответы
Ответ 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 в качестве составного, вы уверены, что не пытаетесь вставить дубликат?