2009-06-22 34 views
2

好吧,我已经确认我只有这个问题,当我试图在主键上查询时,如果实体中的主键被设置为'自动生成值' - 但w/o这个,我怎么插入?对不起,如果这是一个noob linq2sql,但我刚开始使用它。LINQ to sql + stackoverflow查询对象时发生异常

如何使用Linq to Sql关闭此选项但也有db处理pk的?我讨厌必须每次都得到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做自动增量,这是身份列。

回答

3

pkID是如何实现的?有什么机会以某种方式递归?

+2

好吧,这是一个疏忽和技术的新手。要解决此问题,请执行以下操作: 使用“自动生成的值”= True时,必须将“延迟加载”设置为False - 否则会出现递归错误。 – schmoopy 2009-06-22 15:33:17

0

您的数据表太大!

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

1

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

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

编辑作为一个现成的,墙的事,尽量.Where(x=>x.ID == id).SingleOrDefault() - 按照这个bug(一个链接),这不使用身份查找伎俩,直到4.0艘。

我想先知道被启动:

  • 有什么奇怪的ID的getter/setter(有你添加的代码?)
    • 你在一个局部类完成什么为这个类型?
  • 它是继承链的一部分吗?
    • 如果是这样,你有没有用父类型的部分类猴子?
  • 爆炸时,你会在调用堆栈窗口中看到什么吗?
+0

伟大的问题,是的我忘了提及:在datacontext设计器内我设置这个表上的pk为'自动生成的值'这是因为我用它作为主键在sql中自动增量 - 不能评估调用堆栈或任何东西在堆栈溢出 – schmoopy 2009-06-22 15:08:16

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