查询对象时linq to sql + stackoverflow异常

时间:2009-06-22 14:47:35

标签: c# .net linq linq-to-sql stack-overflow

好的,我确认我只有这个问题当我尝试查询主键时,如果实体中的主键设置为'自动生成值' - 但是没有这个,我该如何插入?对不起,如果这是一个菜鸟linq2sql,但我刚开始使用它。

如何在关闭此选项的情况下使用Linq to Sql,还让db处理pk?我不想每次都要qry得到pk我应该分配......

我希望有人可以帮助我,我完全无法在我的一个项目中使用linq到sql,不确定要做什么...这是一个例子,这行会引发StackOverflow异常。

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

- 第二行抛出StackOverflow异常。

使用相同的datacontext

的另一个例子
var o = dc.MyDataTable.Take(1); <-- works fine
var abc = o.ToArray();  <-- unable to evaluate, debugger stops

我能尝试的任何想法?在同一个解决方案中,我似乎可以在另一个项目中使用linq to sql。

- 更新 - 我忘了提到这个特定的实体'MyDataTable'将pk设置为'自动生成的值' - 我设置为这个因为我有sql做自动增量,这是标识列。

4 个答案:

答案 0 :(得分:3)

如何实施pkID?它有可能以某种方式递归吗?

答案 1 :(得分:1)

Take(1)工作并不让我感到惊讶,因为这并没有真正执行任何事情(它会延迟到数据被迭代)。

这是一个有趣的问题 - 尤其是因为SingleOrDefault(x=>x.ID == id)内部实际上有different processing - 它将此识别为主键查找并检查身份管理器优先

编辑 作为一个彻头彻尾的事情,尝试.Where(x=>x.ID == id).SingleOrDefault() - 根据错误(上一个链接),这不使用身份查找技巧直到4.0发货。

我首先想知道:

  • ID getter / setter中有什么奇怪的东西(你添加了代码吗?)
    • 您是否在此类型的分部课程中完成了任何
  • 是继承链的一部分吗?
    • 如果是这样,你有没有父类型的部分类?
  • 在爆炸时,你在调用堆栈窗口中得到了什么吗?

答案 2 :(得分:1)

这是在LINQ 4.0中纠正的错误

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

  

查询稳定性包含现在检测到自引用IQueryable并且不会导致堆栈溢出

在.NET 3.5中解决问题:当使用“Auto Generated Value”= True时,必须将“Delay Loaded”设置为False - 否则会出现递归错误。

答案 3 :(得分:0)

你的数据表太大了!

编辑。 MyDataTable真的是DataTable吗?或者它实际上是LINQ to SQL表&lt; ...&gt; ?如果是这样,请删除AsQueryable()。