Броски вставки LINQ to SQL Basic: присоединить или добавить исключение, не связанное с новым объектом - PullRequest
12 голосов
/ 23 июня 2009

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

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 - действующий идентификатор центра, AssessmentCentreId и AttemptNumber являются единственными ненулевыми полями, все остальные столбцы допускают пустые значения.

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

UPDATE:

Добавление

dc.DeferredLoadingEnabled = false;

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

Ответы [ 3 ]

7 голосов
/ 15 сентября 2009

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

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

http://linq2sqleb.codeplex.com/

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

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

4 голосов
/ 03 октября 2010

Проблема в том, что объект Center не существует в контексте. Это в БД, но не "в ваших руках" с a2. Попробуйте это:

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

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

0 голосов
/ 26 июня 2009

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

...