2

エンティティ フレーム ワーク モデルから製品エンティティのコレクションを返す WCF サービスを作成しました。その製品には自己参照があります。Silverlight アプリケーションで WCF サービスからのデータを使用します。私は非同期メソッドを使用します。製品エンティティは、次の形式でモデル化されました。

Public partial class Product
{

    Public  Product(){
        this.product_11=new HashSet<Product>;
    }

    [DataMember]
    public int Id{get; set;}
    [DataMember]
    public Nullable<int> subPro{get; set;}
    [DataMember]
    Public virtual Icollection<Product> product_11{get; set;}
    [DataMember]
    Public virtual Product product_12{get; set;}
}

そして私はそれをサービスメソッドで使用します

productEntity ef=new productEntity();

[OperationContract]
Public IEnumerable<Product> Getproduct()
{
    return ef.Product;
}

実行時にサービスメソッドを呼び出すと、タイムアウトエラーが発生します

「HTTP 要求が ... 割り当てられたタイムアウトを超えました」

4

1 に答える 1

1

問題は、WCF サービスと組み合わせて戻り値の型として IQueryable を使用することにあると思います。

[OperationContract]
Public IEnumerable<Product> Getproduct()
{
   return ef.Product.ToList();
}

この場合、クエリはToList()メソッドの呼び出しで実行されるため、WCF は IQueryable を実行する必要はありません。

2 番目の部分は、コンテキストからモデルのオブジェクトを返すときに、シリアル化の問題が発生する可能性があることです。EF は、継承によってモデル クラスに遅延読み込みの機能を挿入するためです。

サービス メソッドで現在のコンテキストの遅延読み込みをオフにする必要があります。

context.ContextOptions.LazyLoadingEnabled = false;
context.ContextOptions.ProxyCreationEnabled = false;

これは、このリンクで説明されています

次に、モデル クラスを XML メッセージに変換するシリアライザーが、循環参照に問題を抱えています。問題を引き起こす可能性のある例を次に示します。

public class A 
{
    public string PropA { get; set; }
    public virtual B PropB { get; set; }
}

public class B
{
    public string PropC { get; set; }
    public virtual A PropD { get; set; }
}

これは、メソッドのCyclicReferencesAware属性を使用して回避できます。OperationContract

[OperationContract]
[CyclicReferencesAware(true)]
Public IEnumerable<Product> Getproduct()
{
    return ef.Product.ToList();
}

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

于 2013-08-06T07:31:51.527 に答える