eccezione da linq a sql + stackoverflow durante l'interrogazione di oggetti
-
06-07-2019 - |
Domanda
OK, ho confermato questo problema solo quando tento di eseguire una query sulla chiave primaria se quella chiave primaria nell'entità è impostata su "Valore generato automaticamente" - ma senza questo, come posso inserire? Scusate se questo è un linq2sql noob ma ho appena iniziato a lavorarci.
Come si usa Linq to Sql con questa opzione disattivata ma anche il db gestisce il pk? Odierei dover ripetere ogni volta per ottenere il pk che dovrei assegnare ...
Spero che qualcuno mi possa aiutare, non sono del tutto in grado di usare linq per sql in uno dei miei progetti, non sono sicuro di cosa fare ... ecco un esempio, questa riga genera un'eccezione StackOverflow.
MyDataContext dc = new MyDataContext(ConnStr);
var obj = dc.MyDataTable.AsQueryable().SingleOrDefault(a => a.pkID == 4);
- La seconda riga genera l'eccezione StackOverflow.
Ecco un altro esempio usando lo stesso datacontext
var o = dc.MyDataTable.Take(1); <-- works fine
var abc = o.ToArray(); <-- unable to evaluate, debugger stops
Qualche idea su cosa posso provare? Mi sembra di stare bene usando linq to sql in un altro progetto nella stessa soluzione.
- AGGIORNAMENTO-- Ho dimenticato di dire che questa particolare entità 'MyDataTable' ha il pk impostato come 'Auto Generated Value' - l'ho impostato su questa causa ho sql che fa auto incremento e questa è la colonna identità.
Soluzione
Come viene implementato pkID? Qualche possibilità è ricorsiva in qualche modo?
Altri suggerimenti
Il Take(1)
funzionamento non mi sorprende, in quanto non esegue nulla (viene rinviato fino a quando i dati non vengono ripetuti).
Questo è un problema interessante, anche perché SingleOrDefault(x=>x.ID == id)
in realtà ha elaborazione diversa internamente - riconosce questa come una ricerca della chiave primaria e controlla il gestore identità prima .
EDIT Come cosa fuori dal comune, prova .Where(x=>x.ID == id).SingleOrDefault()
- come per il bug (link precedente), questo non usa il trucco di ricerca dell'identità fino alla 4.0 navi.
Vorrei iniziare chiedendomi:
- c'è qualcosa di strano nell'ID getter / setter (hai aggiunto del codice?)
- hai fatto qualcosa in una classe parziale per questo tipo?
- fa parte di una catena di eredità?
- e, in tal caso, hai fatto una scimmia con una classe parziale per il tipo parent?
- trovi qualcosa nella finestra dello stack di chiamate quando esplode?
È stato corretto un bug in LINQ 4.0
http: // damieng .com / blog / 2009/06/01 / LINQ-to-SQL-cambiamenti-in-net-40
Stabilità della query Contiene ora rileva IQueryable autoreferenziale e non causa un overflow dello stack
In .NET 3.5 per risolvere il problema: quando si utilizza "Valore generato automaticamente" = Vero, è necessario impostare "Ritardo caricato" su Falso, altrimenti si verifica l'errore di ricorsione.
Il tuo datatable è troppo grande!
Modifica. MyDataTable è davvero una DataTable? O in realtà è una tabella LINQ to SQL & Lt; ... & Gt; ? In tal caso, rimuovere AsQueryable ().