LINQ to SQL + stackoverflow exceção ao consultar objetos
-
06-07-2019 - |
Pergunta
OK, eu confirmaram eu só esta questão quando tento consulta na chave primária, se essa chave primária na entidade é definida como 'Auto valor gerado' - mas w / o presente, como posso inserir? Desculpe se isso é uma linq2sql do noob, mas eu só comecei a trabalhar com ele.
Como se faz para usando LINQ to SQL com essa opção desativada, mas também têm a alça db o pk de? Eu odiaria ter que toda qry para obter o pk i deve atribuir ...
Espero que alguém possa me ajudar, im completamente incapaz de usar LINQ to SQL em um dos meus projetos, realmente não sei o que fazer ... aqui está um exemplo, esta linha gera uma exceção StackOverflow.
MyDataContext dc = new MyDataContext(ConnStr);
var obj = dc.MyDataTable.AsQueryable().SingleOrDefault(a => a.pkID == 4);
-. Essa segunda linha lança a exceção StackOverflow
Aqui está outro exemplo, usando o mesmo datacontext
var o = dc.MyDataTable.Take(1); <-- works fine
var abc = o.ToArray(); <-- unable to evaluate, debugger stops
Todas as idéias que eu possa tentar? I parecem estar bem usando LINQ to SQL em outro projeto na mesma solução.
- UPDATE-- Eu esqueci de mencionar que esta entidade particular 'MyDataTable' tem o conjunto pk como 'valor gerado Auto' - i tê-lo definido para esta causa eu tenho sql fazendo auto incremento e esta é a coluna de identidade
.Solução
Como é PKID implementado? Alguma chance é recursiva de alguma forma?
Outras dicas
O trabalho Take(1)
não me surpreende, pois isso realmente não executar qualquer coisa (que é diferido até que os dados é iterativo).
Isso é um problema interessante - até porque o SingleOrDefault(x=>x.ID == id)
realmente tem processamento diferente internamente -. reconhece isso como uma pesquisa de chave primária e verifica o gerente identidade início
Editar Como uma coisa off-the-wall, tente .Where(x=>x.ID == id).SingleOrDefault()
- de acordo com o bug (link anterior), este não usa o truque de pesquisa identidade até 4.0 navios.
Eu seria começar por se perguntando:
- há alguma coisa estranha na ID getter / setter (tem você adicionou código?)
- que você fez qualquer em uma classe parcial para este tipo?
- é parte de uma cadeia de herança?
- e se assim for, você já brincou com uma classe parcial para o tipo de pai?
- você conseguir alguma coisa na janela de chamada-stack quando explode?
Isso foi um bug corrigido no LINQ 4.0
http: // damieng .com / blog / 2009/06/01 / linq-to-sql-changes-in-net-40
estabilidade consulta contém agora detecta auto-referência IQueryable e não causar um estouro de pilha
Em .NET 3.5 para resolver o problema:. Ao usar 'Auto Gerado Valor' = True, em seguida, você deve definir 'Delay Loaded' to False - caso contrário você obter o erro recursão
A sua tabela de dados é muito grande!
Editar. MyDataTable é realmente um DataTable? Ou é realmente um LINQ to SQL Table <...>? Se assim for, remova o AsQueryable ().