上記の構成を機能させようとしましたが、運がありません。
ステップ1)
WCF サービス アプリケーションプロジェクトで新しいソリューションを開始しました。
ステップ2)
このプロジェクトでは、edmx ファイルを追加し、非常に単純なモデルを作成します: IdとDisplayNameを持つ
Entity Parent IdとChildDisplayNameを持つ
Entity Child
Association from Parent to Child、1-to-m、結果として両方のエンティティに NavigationProperties が生成されます。
問題なくデータベースを生成しました。生成後、関連する 2 つの子オブジェクトを持つ 1 つの親オブジェクトを手動でデータベースに挿入しました。
ステップ 3)
ADO.NET Self-Tracking Entity Generatorを使用して、コード生成を追加しました。これは別のアセンブリで行う必要があることはわかっていますが、わかりやすく簡単にするために、すべてを同じプロジェクト (WCF プロジェクト) に配置します。
ステップ 4)
IService インターフェイスを変更して、単純な get を作成しました
[OperationContract]
Parent GetRootData(Int32 Id);
対応する実装では、コンテキストからPageオブジェクトを取得して返します。
using (PpjSteContainer _context = new PpjSteContainer() )
{
return _context.ParentSet.Include("Child").Single(x => x.Id == Id);
}
問題:
ここでこのプロジェクトを実行すると (Service1.svc は開始ページです)、VS2010 はサービスを呼び出すテスト クライアントを自動的に生成します。しかし、サービスを呼び出すと、StackOverflowException が発生します。サーバー側でのデバッグは、オブジェクト グラフが返されるまで問題ないように見えます。
Include("Child")を削除すると、すべて問題ありませんが、もちろんChildオブジェクトが欠落しています。
何が欠けているのかわかりません。私は多くのハウツーとガイドを読みましたが、すべて私がやった方法でそれを行います(少なくともそれは私が思うことです)...私はここ
で
学校の例を試しましたが、データベースの生成と例のコーディングは一致しません。
ですから、誰かがこの作業を行う方法を教えていただければ幸いです。
PS
- はい、すべてのエンティティ クラスは「[DataContract(IsReference = true)]」とマークされています。
- edmx ファイルで Lazy-Loading が「false」に設定されている
編集:
WCF を IIS ではなく、コンソール アプリでホストされるように変更しました。もちろん、私は自分の小さなテスト クライアントを作成する必要がありました。
面白いことに、今ではすべてが機能しています。もちろん理由はわかりませんが、少なくとも私のテストでは、これが解決策です...