linq to sql + stackoverflow исключение при запросе объектов - PullRequest
2 голосов
/ 22 июня 2009

ОК, я подтвердил только эту проблему, когда я пытаюсь запросить первичный ключ, если для этого первичного ключа в сущности установлено значение «Автоматически сгенерированное значение» - но без этого, как я могу вставить? Извините, если это noob linq2sql, но я только начал с ним работать.

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

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

Ответы [ 4 ]

3 голосов
/ 22 июня 2009

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

1 голос
/ 21 июля 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 - в противном случае вы получите ошибку рекурсии.

1 голос
/ 22 июня 2009

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

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

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

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

  • есть что-нибудь странное в идентификаторе-получателе (вы добавили код?)
    • Вы сделали что-нибудь в частичном классе для этого типа?
  • это часть цепочки наследования?
    • и если это так, вы связались с частичным классом для родительского типа?
  • вы получаете что-нибудь в окне стека вызовов, когда оно взрывается?
0 голосов
/ 22 июня 2009

Ваши данные слишком велики!

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

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