исключение linq to sql + stackoverflow при запросе объектов

Хорошо, я подтвердил только эту проблему, когда я пытаюсь запросить первичный ключ, если этот первичный ключ в объекте установлен на «Автоматически сгенерированное значение» — но без этого, как я могу вставить? Извините, если это нуб linq2sql, но я только начал с ним работать.

Как можно использовать Linq to Sql с отключенной этой опцией, но при этом db обрабатывает pk? Я бы не хотел каждый раз спрашивать, чтобы получить pk, который я должен назначить ...

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

MyDataContext dc = new MyDataContext(ConnStr);
var obj = dc.MyDataTable.AsQueryable().SingleOrDefault(a => a.pkID == 4);

-- Эта вторая строка вызывает исключение StackOverflow.

Вот еще один пример с использованием того же контекста данных

var o = dc.MyDataTable.Take(1); <-- works fine
var abc = o.ToArray();  <-- unable to evaluate, debugger stops

Любые идеи, что я могу попробовать? Кажется, у меня все в порядке с использованием linq to sql в другом проекте в том же решении.

-- ОБНОВЛЕНИЕ -- Я забыл упомянуть, что этот конкретный объект «MyDataTable» имеет pk, установленный как «Автоматически сгенерированное значение» – я установил его для этой причины, у меня есть sql, выполняющий автоматическое увеличение, и это столбец идентификаторов.


person schmoopy    schedule 22.06.2009    source источник


Ответы (4)


Как реализован pkID? Есть ли шанс, что это каким-то образом рекурсивно?

person n8wrl    schedule 22.06.2009
comment
хорошо, это был недосмотр и новичок в технологии. Чтобы решить проблему: при использовании «Автогенерируемое значение» = «Истина» вы должны установить «Отложенная загрузка» на «Ложь», иначе вы получите ошибку рекурсии. - person schmoopy; 22.06.2009

Работа Take(1) меня не удивляет, так как на самом деле ничего не выполняется (она откладывается до тех пор, пока данные не будут итерированы).

Это интересная проблема, не в последнюю очередь потому, что SingleOrDefault(x=>x.ID == id) на самом деле имеет различную обработку внутренне — он распознает это как поиск по первичному ключу и сначала проверяет диспетчер удостоверений.

РЕДАКТИРОВАТЬ В качестве необычной вещи попробуйте .Where(x=>x.ID == id).SingleOrDefault() - согласно ошибке (предыдущая ссылка), это не использует трюк с поиском удостоверений, пока не выйдет версия 4.0.

Я бы начал с вопроса:

  • is there anything odd in the ID getter/setter (have you added code?)
    • have you done anything in a partial class for this type?
  • is it part of an inheritance chain?
    • and if so, have you monkeyed with a partial class for the parent type?
  • вы получаете что-нибудь в окне стека вызовов, когда оно взрывается?
person Marc Gravell    schedule 22.06.2009
comment
отличный вопрос, и да, я забыл упомянуть: в дизайнере контекста данных я установил pk в этой таблице на «Автоматически сгенерированное значение», это потому, что я использую его в качестве первичного ключа с автоматическим увеличением в sql - не могу оценить стек вызовов или что-то в этом роде после переполнения стека - person schmoopy; 22.06.2009

Это была ошибка, исправленная в LINQ 4.0.

http://damieng.com/blog/2009/06/01/linq-to-sql-changes-in-net-40

Стабильность запроса. Содержит теперь обнаруживает самоссылку IQueryable и не вызывает переполнения стека.

В .NET 3.5 для решения проблемы: при использовании «Auto Generated Value» = True вы должны установить для «Delay Loaded» значение False, иначе вы получите ошибку рекурсии.

person Jader Dias    schedule 21.07.2009

Ваш datatable слишком велик!

Редактировать. Является ли MyDataTable действительно DataTable? Или это на самом деле таблица LINQ to SQL‹...>? Если это так, удалите AsQueryable().

person Pete Montgomery    schedule 22.06.2009