Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

В .NET 3.5 для решения проблемы:При использовании «Автогенерируемого значения» = True вы должны установить для параметра «Задержка загрузки» значение False, иначе вы получите ошибку рекурсии.

Ваша таблица данных слишком велика!

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top