C # - Entity Framework - в mscorlib.dll возникло необработанное исключение типа «System.StackOverflowException» - PullRequest
23 голосов
/ 15 января 2010

Произошло необработанное исключение типа «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();
}

При возврате он вызывает в Entity Model и пытается заполнить все объекты с внешним ключом (дочерние объекты). Схема: [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?

Ответы [ 5 ]

6 голосов
/ 02 февраля 2010

После трехкратного удаления и восстановления моей модели с нуля переполнение стека волшебным образом исчезло.

Выясните, что где-то вдоль линии произошла ошибка мастера.

1 голос
/ 06 августа 2010

Я столкнулся с той же самой проблемой, используя Asp.net Mvc, Sql Server и Linq to Entities. Проходя через стек вызовов, я увидел, что в двух из моих репозиториев в каждом другом репозитории был новый вызов из репозитория. Пример ...

Repository1.cs

Respository2 repo2 = new Repository2();

Repository2.cs

Repository1 repo1 = new Repository1();

Я предполагаю глупую ошибку с моей стороны, не совсем уверенную в том, что происходит (может быть, кто-то может здесь перезвонить ...), помимо очевидного, но я убрал вызовы Репозитория, и теперь все работает отлично.

1 голос
/ 17 января 2010

Попробуйте это:

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 голосов
/ 15 января 2010

Я думаю, что вам нужно установить отношение Company -> Company, чтобы оно загружалось лениво.

0 голосов
/ 15 января 2010

Ошибка StackOverflow возникает из-за бесконечного цикла, который использует всю кэш-память, а затем в конце выдает ошибку переполнения стека.

Бесконечный цикл необходимо остановить, и не рекомендуется вызывать одну и ту же функцию.

Оптимизируйте код и старайтесь избегать циклов.

...