4

WCF REST サービス (GET メソッド) を使用して EF4 POCO を取得しています。サービスは問題なく機能しているようです。ブラウザで uri をクエリすると、期待どおりの結果が得られます。

私のクライアント アプリケーションでは、WCF REST スターター キットのHTTPExtension メソッド - ReadAsDataContract()を使用して、結果を POCO に変換しようとしています。これは、POCO のナビゲーション プロパティが関連する POCO の単一のオブジェクトである場合にうまく機能します。問題は、ナビゲーション プロパティが関連する POCO のコレクションである場合です。ReadAsDataContract() メソッドは、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージとともに例外をスローします。

以下は私のPOCOです。

[DataContract(Namespace = "", Name = "Trip")]
public class Trip
{
    [DataMember(Order = 1)]
    public virtual int TripID { get; set; }

    [DataMember(Order = 2)]
    public virtual int RegionID { get; set; }

    [DataMember(Order = 3)]
    public virtual System.DateTime BookingDate { get; set; }

    [DataMember(Order = 4)]
    public virtual Region Region { // removed for brevity 
    }
}

[DataContract(Namespace = "", Name = "Region")]
public class Region 
{
    [DataMember(Order = 1)]
    public virtual int RegionID { get; set; }

    [DataMember(Order = 2)]
    public virtual string RegionCode { get; set; }

    [DataMember(Order = 3)]
    public virtual FixupCollection<Trip> Trips { // removed for brevity
    }
}

[CollectionDataContract(Namespace = "", Name = "{0}s", ItemName = "{0}")]
[Serializable]
public class FixupCollection<T> : ObservableCollection<T>
{
    protected override void ClearItems()
    {
        new List<T>(this).ForEach(t => Remove(t));
    }

    protected override void InsertItem(int index, T item)
    {
        if (!this.Contains(item))
        {
            base.InsertItem(index, item);
        }
    }
}

そして、これがリージョンPOCOを取得しようとしている方法です。

static void GetRegion()
    {   
        string uri = "http://localhost:8080/TripService/Regions?id=1";
        HttpClient client = new HttpClient(uri);

        using (HttpResponseMessage response = client.Get(uri))
        {
            Region region;
            response.EnsureStatusIsSuccessful();
            try
            {  
                region = response.Content.ReadAsDataContract<Region>(); // this line throws exception because Region returns a collection of related trips
                Console.WriteLine(region.RegionName);                    
            }
            catch (Exception ex)
            {
               Console.WriteLine(ex.Message);
            }
        }
    }

ポインタをいただければ幸いです。

4

3 に答える 3

2

チェックするもう1つのことは、プロキシの生成と遅延読み込みが、クエリを実行して結果を返す操作を壊していないかどうかです。プロパティがすべて仮想としてマークされているという事実により、プロキシが生成され、遅延読み込みが有効になります。これら 2 つの機能が動作している状態でシリアライズすると、シリアライザーに大混乱が生じます。

この場合に私が行うことは、データを返す操作です。たとえば、それらをオフにします(インテリセンスの助けを借りずにメモリから入力していることに注意してください...)

public List GetSomeTrips { context.ContextOptions.LazyLoadingEnabled=false; contxt.ContetOptions.ProxyGenerationEnabled=false;
return context.Trips.ToList(); }

于 2011-03-10T15:49:58.220 に答える
1

質問にコメントできないので。公開仮想 FixupCollection Trips を設定してみましたか

標準 get のプロパティとして。設定;

データコントラクトと、カスタムのゲッターとセッターの定義に問題がありました。そのロジックは、オーバーライドされるため、エンティティ/オブジェクト自体にある必要があります。

それは私にとって多くのことを修正してくれました。

于 2011-03-06T00:03:36.043 に答える
0

これは、含まれていないPOCOにすでに含まれている可能性があります-コンストラクターはありますか? あなたは試すことができます

public Region(){
    this.Trips = new FixupCollection<Trip>();
}

これにより、null ref エラーが解決される場合があります。FixupCollectionそれがあなたのクラスである場合も同じです。

于 2011-03-06T08:07:22.987 に答える