linq to sql + stackoverflow exception when querying objects

a 夏天 提交于 2019-12-22 12:22:18

问题


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.


回答1:


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




回答2:


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?



回答3:


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.




回答4:


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



来源:https://stackoverflow.com/questions/1027628/linq-to-sql-stackoverflow-exception-when-querying-objects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!