2009-06-22 4 views
2

OK, j'ai confirmé ce problème uniquement lorsque j'essaie d'interroger la clé primaire si cette clé primaire dans l'entité est définie sur "Valeur générée automatiquement". o ceci, comment puis-je insérer? Désolé si c'est un linq2sql noob mais j'ai juste commencé à travailler avec lui.linq to sql + stackoverflow exception lors de l'interrogation d'objets

Comment est-ce que l'on peut utiliser Linq to Sql avec cette option désactivée mais aussi le db gérer les pk? Je détesterais devoir qry à chaque fois pour obtenir le pk je devrais assigner ...

J'espère que quelqu'un peut m'aider, im complètement incapable d'utiliser linq à sql dans un de mes projets, pas vraiment sûr de quoi faire ... voici un exemple, cette ligne jette une exception StackOverflow.

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

- Cette deuxième ligne renvoie l'exception StackOverflow.

Heres un autre exemple en utilisant la même datacontext

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

Toutes les idées ce que je peux essayer? Il me semble que j'utilise linq to sql dans un autre projet dans la même solution.

- UPDATE-- J'ai oublié de mentionner que cette entité particulière 'MyDataTable' a le set pk comme 'Auto Generated Value' - Je l'ai mis à cette cause que j'ai sql auto increment et c'est le colonne d'identité.

Répondre

3

Comment pkID est-il implémenté? Y a-t-il une chance que ce soit récursif?

+2

ok, c'était un oubli et un débutant à la technologie. Pour résoudre le problème: Lorsque vous utilisez 'Auto Generated Value' = True, vous devez définir 'Delay Loaded' sur False - sinon vous obtenez l'erreur de récursivité. – schmoopy

0

Votre datatable est trop grand!

Modifier. MyDataTable est-il vraiment un DataTable? Ou est-ce réellement un tableau LINQ to SQL < ...>? Si c'est le cas, supprimez le AsQueryable().

1

Le travail Take(1) ne me surprend pas, car cela n'exécute vraiment rien (il est différé jusqu'à ce que les données soient itérées).

C'est un problème intéressant - surtout parce que le SingleOrDefault(x=>x.ID == id) a effectivement different processing interne - il le reconnaît comme une recherche de clé primaire et vérifie le gestionnaire d'identité premier.

EDIT Comme une chose hors du mur, essayez .Where(x=>x.ID == id).SingleOrDefault() - selon le bug (lien précédent), cela ne veut pas utiliser l'astuce de recherche d'identité jusqu'à 4.0 navires.

je serais commencer par se demander:

  • est là quelque chose de bizarre dans le getter ID/setter (Avez-vous ajouté le code?)
    • avez-vous fait quoi que ce soit dans une classe partielle pour ce type?
  • fait-il partie d'une chaîne d'héritage?
    • et si oui, avez-vous monkeyed avec une classe partielle pour le type parent?
  • avez-vous quelque chose dans la fenêtre de la pile d'appel quand elle explose?
+0

bonne question et oui j'ai oublié de mentionner: dans le concepteur datacontext j'ai mis le pk sur cette table à 'Auto Generated Value' c'est parce que je l'utilise comme une clé primaire avec incrémentation automatique en sql - ne peut évaluer l'appel pile ou quoi que ce soit après le stackoverflow – schmoopy

1

Ce fut un bug corrigé dans LINQ 4,0

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

la stabilité de la requête contient détecte maintenant IQueryable auto-référencement et ne provoque pas un débordement de pile

Dans .NET 3.5 pour résoudre le problème: Lorsque vous utilisez 'Auto Generated Value' = True, vous devez définir 'Delay Loaded' sur False - sinon vous obtenez l'erreur de récursivité.