查询对象时linq to sql + stackoverflowexception

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

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

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

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

– 第二行抛出StackOverflowexception。

下面是使用相同datacontext的另一个示例

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

我有什么想法可以尝试吗? 我似乎很好在同一个解决方案中使用linq to sql在另一个项目中。

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

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

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

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

编辑作为一个.Where(x=>x.ID == id).SingleOrDefault()东西,尝试.Where(x=>x.ID == id).SingleOrDefault() – 根据bug(上一个链接),这不会使用身份查找技巧,直到4.0船舶。

我想开始想知道:

  • ID getter / setter中有什么奇怪的东西(你添加了代码吗?)
    • 你有没有为这种类型的部分类做过什么
  • 它是inheritance链的一部分吗?
    • 如果是这样,你有没有为父类型的部分类?
  • 当它爆炸时你在调用堆栈窗口中得到什么?

这是在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 – 否则会出现递归错误。

你的数据表太大了!

编辑。 MyDataTable真的是DataTable吗? 或者它实际上是LINQ to SQL Table <...>? 如果是这样,删除AsQueryable()。