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à.

È stato utile?

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 ().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top