web-dev-qa-db-ja.com

C#-Entity Framework-mscorlib.dllでタイプ「System.StackOverflowException」の未処理の例外が発生しました

タイプ '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();
}

戻ったとき、エンティティモデルを呼び出し、すべての外部キーオブジェクト(子オブジェクト)にデータを入力しようとします。スキーマは[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);
        }
    }
}

ご覧のとおり、最初のメソッドは2番目のメソッドを呼び出します。 2番目のメソッドは、それ自体を際限なく呼び出すようです。

EFでこれを修正するにはどうすればよいですか?

23
Keith Barrows

モデルを最初から削除して再構築することを3回行った後、スタックオーバーフローは魔法のようになくなりました。 <grrrrr />

線のどこかで悪いウィザードエラーになるまでそれをチョークしてください。

6
Keith Barrows

Asp.net Mvc、Sql Server、およびLinq to Entitiesを使用して、これとまったく同じ問題が発生しました。コールスタックを調べてみると、私の2つのリポジトリのそれぞれが、他のリポジトリで新しいリポジトリ呼び出しを持っていることがわかりました。例...

Repository1.cs

Respository2 repo2 = new Repository2();

Repository2.cs

Repository1 repo1 = new Repository1();

私はばかげた間違いをしていると思いますが、何が起こっているのか正確にはわかりません(たぶん誰かがここでチャイムを鳴らすことができます...)明白なことは別として、リポジトリの呼び出しを呼び出したところ、すべて正常に動作しました。

1
Justin Soliz

これを試して:

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
Florim Maxhuni

Company-> Companyリレーションを遅延ロードするように設定する必要があると思います。

0
Adrian Zanescu