0

Entity Framework 5.0 と POCO エンティティを使用する WCF サーバー アプリケーションがあります。サーバーは、WCF を介して POCO をクライアント アプリケーションに直接シリアル化します (ブログ投稿http://www.sanderstechnology.com/?p=10142の手順に従って、これを行うことができました)。今日新しい問題が発生するまで、これはかなりうまく機能しています。

次の画像に示すように、データ モデルには単純な状況があります

私のサーバーには、ブロックを取得するために使用できるメソッドがあります。

[OperationContract]
[ApplyDataContractResolver]
[CyclicReferencesAware(true)]
List<Block> GetBlocks();

ブロックにリンクされたプロジェクトを応答に含める必要があるため、次のようにします。

public List<Block> GetBlocks()
{
    using (ModelContainer db = new ModelContainer())
    {
        db.Configuration.ProxyCreationEnabled = false;
        db.Configuration.LazyLoadingEnabled = false;
        return db.Block.Include(it => it.Project).ToList();
    }
}

私のデータベースには、タイプ ProjectA および ProjectB (Project から継承されたもの) のインスタンスがあります。したがって、上記の LINQ クエリには、実際には ProjectA と ProjectB の型が応答に含まれています。これらの型はシリアル化され、クライアントに送信されます。これが発生すると、クライアント側で次のエラーが発生します (サーバー アプリケーションではエラーは発生しません)。

サーバーは意味のある応答を返しませんでした。これは、コントラクトの不一致、時期尚早のセッション シャットダウン、または内部サーバー エラーが原因である可能性があります。

問題は、私のデータ コントラクト タイプ Block がタイプ Project にリンクされていることです。ただし、私の応答は、ブロックにリンクされたタイプ ProjectA および ProjectB を含むデータを返します。

この問題を解決する方法がわかりません。カスタム DataContractResolver を実装することで解決できると思いますが、これを行う方法の実例は見つかりませんでした。

何か案は?

4

1 に答える 1

1

オブジェクトに明らかな型以外の型が含まれている場合 (インターフェイスの実装や派生クラスなど) 、 KnownType属性が必要になります。

MSDN の例を確認してください。かなり良いです。

[ServiceContract]
[KnownType(typeof(ProjectA))]
[KnownType(typeof(ProjectB))]
class SomeService
{
  [OperationContract]
  [ApplyDataContractResolver]
  [CyclicReferencesAware(true)]
  List<Block> GetBlocks();
于 2013-04-24T13:55:13.970 に答える