2010-01-14 27 views
23

Một ngoại lệ unhandled của loại 'System.StackOverflowException' xảy ra ở mscorlib.dll
Hãy chắc chắn rằng bạn không có một vô hạn vòng lặp hoặc đệ quy vô hạn.C# - Entity Framework - Một ngoại lệ unhandled của loại 'System.StackOverflowException' xảy ra ở mscorlib.dll

Mã dưới đây được gọi vào thành công của phương pháp này:

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(); 
} 

On sự trở lại nó gọi vào Entity Model và cố gắng để cư tất cả các đối tượng keyed nước ngoài (đối tượng trẻ em). Lược đồ là [1 Công ty có 0 đến nhiều Sản phẩmSold]. Vì một lý do nào đó, lệnh gọi vào mã sau chỉ cần xếp vào chính nó:

[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); 
     } 
    } 
} 

Như bạn có thể thấy, phương pháp đầu tiên thực hiện cuộc gọi đến phương pháp thứ hai. Phương pháp thứ hai dường như tự gọi là vô tận.

Làm cách nào để khắc phục sự cố này trong EF?

+0

nhìn tôi giống như một vấn đề với ánh xạ của bạn – hackerhasid

+1

Có gì với tất cả các tên đủ điều kiện? Họ làm cho nó không cần thiết khó khăn để hiểu những gì đang xảy ra. –

+0

các tên đủ điều kiện là từ thế hệ mã của MS cho EF ... –

Trả lời

6

Sau 3 lần tại xoá bỏ và xây dựng lại mô hình của tôi từ đầu, các stack overflow là kỳ diệu biến mất. < grrrrr/>

Phấn lên lỗi thuật sĩ không đúng ở đâu đó dọc theo dòng.

+0

Tương tự cho tôi. Xây dựng lại mô hình và nó đã được cố định – bernie2436

-6

Lỗi StackOverflow xảy ra do Looping vô tận sử dụng bộ nhớ cache đầy đủ và sau đó ở cuối nó hiển thị lỗi tràn ngăn xếp.

Vòng lặp vô tận cần phải dừng lại và đó không phải là phương pháp hay nhất để gọi cùng một chức năng.

Tối ưu hóa mã và cố gắng tránh Vòng lặp.

+2

Hmmm. Vì vậy, bạn đang đề nghị tôi đi vào thuật sĩ tạo mã và dừng lại ở đó? Và tôi phải làm gì vào lần sau khi tôi xây dựng dự án và EF viết lại mã cho tôi? –

+3

@Shivkant, điều đó rõ ràng và được biết đến. Bạn đề xuất một bản sửa lỗi như thế nào? –

0

Tôi nghĩ bạn cần đặt Công ty -> Quan hệ công ty bị tải chậm.

1

Hãy thử điều này:

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

Điều này trông giống như một khả năng. Một khi tôi nhận được một số vụ cháy khác đưa ra tôi sẽ kiểm tra này. Cảm ơn. –

+0

nó rất có thể sẽ giải quyết các đệ quy, nhưng nó không nên được đệ quy ở nơi đầu tiên –

1

Tôi gặp sự cố chính xác này bằng cách sử dụng Asp.net Mvc, Sql Server và LINQ to Entities. Đi qua callstack tôi thấy rằng hai kho của tôi từng có một cuộc gọi kho lưu trữ mới trong kho lưu trữ khác. Ví dụ ...

Repository1.cs

Respository2 repo2 = new Repository2(); 

Repository2.cs

Repository1 repo1 = new Repository1(); 

Tôi đoán một sai lầm ngớ ngẩn trên một phần của tôi, không chắc chắn chính xác whats going on (có thể ai đó có thể kêu vang trong đây ...) ngoài việc hiển nhiên nhưng tôi đã gọi lại các Repository và mọi thứ hoạt động tốt ngay bây giờ.

+0

Cảm ơn rất nhiều, bạn đã cứu mạng tôi. đây là chính xác tôi đã làm trong một repo của tôi. cảm ơn bạn một lần nữa :) –

Các vấn đề liên quan