0

Silverlight MVVMテンプレートを作成していますが、WCFサービスの戻りとエンティティオブジェクトでスタックしています。

これが私がしたことです:

  1. サーバー側でEntityFrameworkを使用する
  2. いくつかのテーブルを使用して小さなテストデータベースを作成しました。
  3. サーバー側でWCFサービスを作成しました
  4. 次に、整数を返す小さなテストメソッドを作成しました。
  5. クライアント側で、サービス参照を追加し、完了したメソッドで整数の結果を正常に受信しました
  6. 次に、テストサービスメソッドを変更して、「Person」オブジェクト(Entity Frameworkのエンティティ)を返します。
  7. サービスリファレンスを更新しましたが、機能しません。
  8. 次に、タイプを基本的なCLRタイプに戻すと、再び機能します

Fiddlerをチェックしたところ、サービス応答で次の504エラーが発生しました。

HTTP / 1.1 504 Fiddler-受信失敗コンテンツタイプ:text / html; charset = UTF-8接続:閉じるタイムスタンプ:08:56:23.783

[Fiddler] ReadResponse()が失敗しました:サーバーはこのリクエストに対する応答を返しませんでした。

これを理解しようとした後、 WCFトレースログに出くわし、次のエラーを見つけました。

    There was an error while trying to serialize parameter :BasicResult. The InnerException message was 'Type 'MVVMProject.Web.DataSource.Person' with data contract name 'Person:http://schemas.datacontract.org/2004/07/MVVMProject.Web.DataSource' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.'.  Please see InnerException for more details.

なぜこんなに難しいのか分かりませんか?エンティティをシリアル化できるようにするには、エンティティにいくつかのプロパティを設定する必要がありますか?Entity Frameworkのdesigner.csファイルを見ると、エンティティにSerializable属性があります。確かに、これはWCFサービスを介してこれを渡すことができることを意味しますか?残念ながら、このエラーはわかりません...

WCFサービスでEntityFrameworkを使用することも可能ですか?

どんな助けでも大歓迎です。

4

1 に答える 1

1

私も同じ問題を抱えていました。それDataContractSerializerは、efオブジェクトのナビゲーションプロパティに問題があることを示しています。

私のテストプロジェクトでは、northwindデータベースを使用しています。推奨されるDbContextを使用してCodeFirstアプローチをテストしたかったのです。

提供されているナビゲーションプロパティは仮想であり、オンデマンドで読み込まれますが、ナビゲーションプロパティのエンティティの最初のレベルでefが返されるだけです。

エンティティオブジェクトのシリアル化時に、エンティティオブジェクトがDbContextにバインドされなくなり、ナビゲーションプロパティのシリアル化が失敗したため、DataContractSerializerが失敗しました。

これは、wcfサービスを介してNWEmployeeオブジェクトを使用しようとしたときに発生します。

私の魂は、データコントラクト属性を持つ新しいオブジェクトのすべてのデータをコピーすることです!

サービスコール:

public IEnumerable<EmployeeWcf> GetAll()
    {
        IEnumerable<EmployeeWcf> result = null;

        result = from e in context.Employees.OrderBy( e => e.LastName ) 
                         select new EmployeeWcf 
                         { 
                             EmployeeId = e.EmployeeID, 
                             Firstname = e.FirstName, 
                             Lastname = e.LastName 
                         };

        return result;
    }

クラス:

    [DataContract]
public class EmployeeWcf
{
    [DataMember]
    public int EmployeeId { get; set; }
    [DataMember]
    public string Firstname { get; set; }
    [DataMember]
    public string Lastname { get; set; }
}

これはうまくいきますが、これは完璧な解決策ではないようです。

これがお役に立てば幸いです。

于 2013-04-15T08:25:22.050 に答える