C# - Entity Framework - Une exception non gérée du type 'System.StackOverflowException " s'est produit dans mscorlib.DLL

une exception non freinée du système de type '.StackOverflowException " s'est produit dans mscorlib.dll

Assurez-vous que vous n'avez pas une boucle infinie ou une récursion infinie.

Le code ci-dessous est appelée sur un succès de cette méthode:

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

sur le retour il appelle dans le modèle D'entité et tente de peupler tous les objets étrangers à clé (objets enfants). Le schéma est [1 entreprise a 0 à beaucoup de produits vendus]. Pour quelque raison, l'appel en le code suivant juste cascades sur lui-même:

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

Comme vous pouvez le voir, la première méthode fait appel à la deuxième méthode. La seconde méthode semble s'appeler sans fin.

Comment puis-je régler ce problème en ce?

23
demandé sur Ether 2010-01-15 00:58:13

5 réponses

après 3 fois à supprimer et reconstruire mon modèle à partir de zéro, le débordement de la pile est parti par magie.

attribuez cela à une mauvaise erreur de magicien quelque part le long de la ligne.

6
répondu Keith Barrows 2010-02-01 23:53:21

essaye ceci:

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(); 
}
1
répondu Florim Maxhuni 2010-01-17 11:11:38

j'ai rencontré ce même problème en utilisant Asp.net Mvc, Sql Server, et Linq to Entities. En parcourant le dossier d'appel, j'ai vu que deux de mes dépôts avaient chacun un nouvel appel de dépôt dans l'autre dépôt. Exemple...

Repository 1.cs

Respository2 repo2 = new Repository2();

Repository2.cs

Repository1 repo1 = new Repository1();

je suppose qu'une erreur stupide de ma part, pas vraiment sûr de ce qui se passe (peut-être que quelqu'un peut sonner ici...) mis à part l'évidence mais j'ai pris les appels de dépôt et tout fonctionne bien maintenant.

1
répondu Justin Soliz 2010-08-06 19:00:15

je pense que vous devez définir la Société -> Société de la relation à la paresse chargé.

0
répondu Adrian Zanescu 2010-01-15 17:10:21

l'erreur StackOverflow se produit en raison d'une boucle sans fin qui utilise la mémoire cache complète et ensuite à la fin elle montre l'erreur stack overflow.

La boucle sans fin doivent être arrêtés et il n'est pas conseillé d'appeler la même fonction.

optimisez le code et essayez d'éviter la boucle.

-6
répondu Shivkant 2010-01-15 09:15:23