2

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

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

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

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

-- 第二行抛出 StackOverflow 异常。

这是另一个使用相同数据上下文的示例

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

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

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

4

4 回答 4

3

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

于 2009-06-22T14:56:12.847 回答
1

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

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

编辑作为一个现成的事情,尝试.Where(x=>x.ID == id).SingleOrDefault()- 根据错误(上一个链接),这在 4.0 发布之前不使用身份查找技巧。

我会首先想知道:

  • ID getter/setter 有什么奇怪的吗(你添加了代码吗?)
    • 你在这个类型的部分类中做过什么吗?
  • 它是继承链的一部分吗?
    • 如果是这样,你有没有为父类型设置一个部分类?
  • 当它爆炸时,你在调用堆栈窗口中得到任何东西吗?
于 2009-06-22T14:55:47.590 回答
1

这是 LINQ 4.0 中更正的错误

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

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

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

于 2009-07-21T01:37:30.517 回答
0

你的数据表太大了!

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

于 2009-06-22T14:55:23.567 回答