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

2

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

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

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

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

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

Вот еще один пример с использованием того же файла datacontext

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

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

- ОБНОВЛЕНИЕ-- Я забыл упомянуть, что эта конкретная сущность "MyDataTable" имеет значение pk как "Auto Generated Value" - я установил эту причину. У меня есть sql, делающий автоматический приращение, и это столбец идентификаторов.

Теги:
linq
linq-to-sql
stack-overflow

4 ответа

3
Лучший ответ

Как реализуется pkID? Какой-нибудь шанс это рекурсивно?

  • 2
    хорошо, это был недосмотр и новичок в технологии. Чтобы решить эту проблему: При использовании «Auto Generated Value» = True, вы должны установить «Delay Loaded» в False - в противном случае вы получите ошибку рекурсии.
1

Это была ошибка, исправленная в 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

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

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

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

Начну с удивления:

  • Есть ли что-то странное в ID-приемнике/сеттере (вы добавили код?)
    • Вы сделали что-то в частичном классе для этого типа?
  • является ли он частью цепочки наследования?
    • и если да, вы обезьяны с неполным классом для родительского типа?
  • Вы получаете что-нибудь в окне стека вызовов, когда оно взрывается?
  • 0
    отличный вопрос, и да, я забыл упомянуть: в конструкторе текстовых данных я установил pk для этой таблицы на «Auto Generated Value», это потому, что я использую его как первичный ключ с автоматическим приращением в sql - не могу оценить стек вызовов или что-то еще после переполнения стека
0

Ваш datatable слишком большой!

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню