2010-01-14 7 views
23

Un'eccezione non gestita di tipo 'System.StackOverflowException' in mscorlib.dll
Assicurarsi che non si dispone di un infinito ciclo o ricorsione infinita.C# - Entity Framework - Un'eccezione non gestita di tipo 'System.StackOverflowException' in mscorlib.dll

Il codice di seguito viene chiamato su un successo di questo metodo:

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

Al ritorno si chiama nel modello di entità e cerca di riempire tutti gli oggetti estranei digitati (oggetti figlio). Lo schema è [1 azienda ha 0 per molti prodotti venduti]. Per qualche ragione, la chiamata nel seguente codice appena cascate su se stessa:

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

Come si può vedere, il primo metodo effettua una chiamata al secondo metodo. Il secondo metodo sembra chiamarsi all'infinito.

Come risolvere questo problema in EF?

+0

mi sembra un problema con i mapping – hackerhasid

+1

Cosa sono tutti i nomi completi? Rendono inutilmente difficile capire cosa sta succedendo. –

+0

i nomi completi provengono dalla generazione di MS del codice per EF ... –

risposta

6

dopo 3 volte a sopprimere e ricostruire il mio modello da zero, l'overflow dello stack è magicamente scomparso. < grrrrr/>

Calcolare fino a un errore di procedura guidata errato da qualche parte lungo la linea.

+0

Lo stesso per me. Ricostruito il modello ed è stato risolto – bernie2436

-6

L'errore StackOverflow si verifica a causa di un loop infinito che utilizza la memoria cache completa e quindi alla fine mostra l'errore di overflow dello stack.

Il ciclo infinito deve essere interrotto e non è consigliabile chiamare la stessa funzione.

Ottimizzare il codice e cercare di evitare il loop.

+2

Hmmm. Quindi mi stai suggerendo di andare nel codice creato dalla procedura guidata e fermarlo lì? E cosa faccio la prossima volta che costruisco il progetto e EF riscrive il codice per me? –

+3

@Shivkant, è ovvio e noto. Come proponi una correzione? –

0

Penso che sia necessario impostare Società -> Relazione aziendale pigro.

1

Prova questo:

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

Questa sembra una possibilità. Una volta che avrò messo fuori altri incendi, metterò alla prova questo. Grazie. –

+0

molto probabilmente risolverà la ricorsività, ma non dovrebbe ricorrere in primo luogo –

1

Ho riscontrato questo stesso esatto problema utilizzando Asp.net Mvc, Sql Server e Linq alle entità. Passando attraverso il callstack ho visto che due dei miei repository avevano ciascuno una nuova chiamata al repository nell'altro repository. Esempio ...

Repository1.cs

Respository2 repo2 = new Repository2(); 

Repository2.cs

Repository1 repo1 = new Repository1(); 

immagino uno stupido errore da parte mia, non so esattamente cosa sta succedendo (forse qualcuno può carillon qui ...) a parte l'ovvio, ma ho preso il repository e tutto funziona bene ora.

+0

Grazie mille, mi hai salvato la vita. questo è esattamente che ho fatto in uno dei miei repo. ancora una volta grazie :) –