2009-06-22 58 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 - 否則會出現遞歸錯誤。