2010-01-14 54 views
23

類型「System.StackOverflowException」未處理的異常出現在mscorlib.dll
確保你沒有無限循環或無限遞歸。C# - 實體框架 - 類型「System.StackOverflowException」未處理的異常出現在mscorlib.dll

下面的代碼被稱爲這個方法的成功:

internal static List<RivWorks.Model.Negotiation.ProductsSold> GetProductsSoldByCompany(Guid CompanyID) 
{ 
    var ret = from a in _dbRiv.ProductsSold where a.Company.CompanyId == CompanyID select a; 
    return ret.ToList(); 
} 

調用它進入實體模型,並嘗試填充所有外國鍵入對象(子對象)的回報。模式是[1公司有0到多個產品銷售]。出於某種原因,呼叫到下面的代碼只是本身級聯:

[global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("RIV_Model", "FK_ProductsSold_Company", "Company")] 
[global::System.Xml.Serialization.XmlIgnoreAttribute()] 
[global::System.Xml.Serialization.SoapIgnoreAttribute()] 
[global::System.Runtime.Serialization.DataMemberAttribute()] 
public Company Company 
{ 
    get 
    { 
     return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Company>("RIV_Model.FK_ProductsSold_Company", "Company").Value; 
    } 
    set 
    { 
     ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Company>("RIV_Model.FK_ProductsSold_Company", "Company").Value = value; 
    } 
} 
/// <summary> 
/// There are no comments for Company in the schema. 
/// </summary> 
[global::System.ComponentModel.BrowsableAttribute(false)] 
[global::System.Runtime.Serialization.DataMemberAttribute()] 
public global::System.Data.Objects.DataClasses.EntityReference<Company> CompanyReference 
{ 
    get 
    { 
     return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference<Company>("RIV_Model.FK_ProductsSold_Company", "Company"); 
    } 
    set 
    { 
     if ((value != null)) 
     { 
      ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference<Company>("RIV_Model.FK_ProductsSold_Company", "Company", value); 
     } 
    } 
} 

正如你可以看到,第一種方法使得第二種方法的調用。第二種方法似乎無休止地稱呼自己。

如何在EF中修復此問題?

+0

在我看來,像你映射的問題 – hackerhasid 2010-01-14 22:04:12

+1

所有完全限定的名稱是什麼?它們使得理解發生的事情變得不必要地困難。 – 2010-01-14 22:06:11

+0

完全合格的名稱來自MS代代EF ... – 2010-01-14 22:08:50

回答

6

3次後,堆棧溢出奇蹟般地消失了。 < grrrrr/>

將它記錄下來,沿線的某處出現錯誤的嚮導錯誤。

+0

同樣適用於我。重建模型,它已修復 – bernie2436 2012-09-17 14:30:27

-6

StackOverflow錯誤是由於無盡的循環使用完整的高速緩存內存,然後在最後它顯示堆棧溢出錯誤發生。

無限循環需要停止,它不是調用相同函數的最佳實踐。

優化代碼並儘量避免循環。

+2

嗯。所以你建議我進入嚮導創建的代碼並停止它?我下次構建項目時會做什麼,EF會爲我重寫代碼? – 2010-01-15 16:12:32

+3

@Sivivant,這是顯而易見的和已知的。你如何提出解決方案? – 2010-01-17 02:12:44

0

我認爲你需要將公司 - >公司關係設置爲延遲加載。

1

試試這個:在刪除並從頭開始重建我的模型

internal static List<RivWorks.Model.Negotiation.ProductsSold> GetProductsSoldByCompany(Guid CompanyID) 
{ 
    var ret = from a in _dbRiv.Company where a.CompanyId == CompanyID select a.ProductsSolds; 
    return ret.ToList(); 
} 
+0

這看起來像是一種可能性。一旦我發生其他的火災,我會測試這個。謝謝。 – 2010-01-18 19:38:58

+0

它很可能會解決遞歸問題,但它不應該首先遞歸。 – 2010-01-18 20:47:13

1

我使用Asp.net Mvc,Sql Server和Linq to Entities遇到了同樣的問題。通過調用堆棧,我看到我的兩個倉庫在另一個倉庫中都有一個新的倉庫調用。例如...

Repository1.cs

Respository2 repo2 = new Repository2(); 

Repository2.cs

Repository1 repo1 = new Repository1(); 

我想一個愚蠢的錯誤在我的部分,並不完全知道怎麼回事(也許有人可以在這裏附和...)除了顯而易見的,但我把倉庫調用了,現在一切正常。

+0

非常感謝,你救了我的命。這正是我一直在做我的回購。再次感謝你:) – 2017-06-27 12:49:18

相關問題