views:

268

answers:

4

OK, i have confirmed i only this issue when i attempt to query on the primary key if that primary key in the entity is set to 'Auto Generated Value' -- but w/o this, how can i insert? Sorry if this is a noob linq2sql but i just started working with it.

How does one go about using Linq to Sql with this option turned off but also have the db handle the pk's? I would hate to have to qry everytime to get the pk i should assign...

I hope someone can help me out, im completely unable to use linq to sql in one of my projects, not really sure what to do... here is an example, this line throws a StackOverflow exception.

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

-- That second line throws the StackOverflow exception.

Heres another example using the same datacontext

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

Any ideas what i can try? I seem to be fine using linq to sql in another project in the same solution.

-- UPDATE-- I forgot to mention that this particular entity 'MyDataTable' has the pk set as 'Auto Generated Value' -- i have it set to this cause i have sql doing auto increment and this is the identity column.

A: 

Your datatable is too big!

Edit. Is MyDataTable really a DataTable? Or is it actually a LINQ to SQL Table<...> ? If so, remove the AsQueryable().

Pete Montgomery
+1  A: 

The Take(1) working doesn't surprise me, as this doesn't really execute anything (it is deferred until the data is iterated).

That is an interesting problem - not least because the SingleOrDefault(x=>x.ID == id) actually has different processing internally - it recognises this as a primary-key lookup and checks the identity manager first.

EDIT As an off-the-wall thing, try .Where(x=>x.ID == id).SingleOrDefault() - as per the bug (previous link), this doesn't use the identity lookup trick until 4.0 ships.

I would be start by wondering:

  • is there anything odd in the ID getter/setter (have you added code?)
    • have you done anything in a partial class for this type?
  • is it part of an inheritance chain?
    • and if so, have you monkeyed with a partial class for the parent type?
  • do you get anything in the call-stack window when it explodes?
Marc Gravell
great question and yes i did forget to mention: within the datacontext designer i set the pk on this table to 'Auto Generated Value' this is because i use it as a primary key with auto increment in sql -- cant evaluate call stack or anything after the stackoverflow
schmoopy
+3  A: 

How is pkID implemented? Any chance it's recursive in some way?

n8wrl
ok, it was an oversight and a newbie to the technology. To resolve the problem:When using 'Auto Generated Value' = True, then you must set 'Delay Loaded' to False - otherwise you get the recursion error.
schmoopy
+1  A: 

That was a bug corrected in LINQ 4.0

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

Query stability Contains now detects self-referencing IQueryable and doesn't cause a stack overflow

In .NET 3.5 to solve the problem: When using 'Auto Generated Value' = True, then you must set 'Delay Loaded' to False - otherwise you get the recursion error.

Jader Dias