Подтвердить что ты не робот

С# - Entity Framework - необработанное исключение типа "System.StackOverflowException" произошло в файле mscorlib.dll

Необработанное исключение типа "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 до многих продуктовSold]. По какой-то причине вызов в следующий код просто каскадирует сам по себе:

[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?

4b9b3361

Ответ 1

После 3-х раз при удалении и восстановлении моей модели с нуля переполнение стека волшебным образом исчезло. < grrrrr/ >

Перемешайте его до ошибки плохого мастера где-то вдоль линии.

Ответ 2

Попробуйте следующее:

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

Ответ 3

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

Repository1.cs

Respository2 repo2 = new Repository2();

Repository2.cs

Repository1 repo1 = new Repository1();

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

Ответ 4

Думаю, вам нужно установить ленту "Компания → Компания".

Ответ 5

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

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

Оптимизируйте код и попытайтесь избежать Looping.