2011-03-01 37 views
4

我正在使用WCF REST服務(GET方法)檢索我的EF4 POCO。該服務似乎工作得很好。當我在瀏覽器中查詢uri時,我得到了預期的結果。使用WCF REST服務入門套件檢索EF4 POCO

在我的客戶端應用程序,我試圖用WCF REST Starter Kit's 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); 
      } 
     } 
    } 

希望任何指針。

+0

顯示您的POCO類的代碼。還要檢查收集是否包含在響應中(使用Fiddler)並描述如何檢索對象和加載的集合(您是使用動態代理,延遲加載等?)。 – 2011-03-02 10:27:27

+0

@Ladislav Mrnka:我編輯了我的問題,添加了我正在使用的代碼。 – muruge 2011-03-02 15:28:50

+0

@Greg Sansom:感謝您分享該鏈接。 – muruge 2011-03-02 15:29:45

回答

2

另一件需要檢查的事情是代理生成&延遲加載會破壞正在查詢和返回結果的操作。事實上,你的專有標記都是虛擬的,會導致生成代理並啓用延遲加載。當您使用這兩個功能進行搜索時,它會對序列化程序造成嚴重破壞。

我在這種情況下,要做的就是在返回我關閉它們例如數據的操作, (注意,我從記憶中鍵入沒有智能感知的幫助......)

公開名單GetSomeTrips { context.ContextOptions.LazyLoadingEnabled = false; contxt.ContetOptions.ProxyGenerationEnabled = false;
return context.Trips.ToList(); }

1

因爲我不能評論這個問題。你有沒有嘗試設置公共虛擬FixupCollection旅行

作爲一個合適的標準獲得;組;

我在數據合同和定義自定義getter和setter方面遇到困難。 該邏輯應該在實體/對象本身中,因爲它將被覆蓋。

這對我來說已經是一大堆事情的補救。

+0

我試着將屬性設置爲標準get set,但沒有運氣。 – muruge 2011-03-07 23:27:42

0

這可能已經在您的POCO中,不包括在內 - 它們是否有構造函數?你可以嘗試

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

這可以解決空裁判的錯誤。如果這是你的課程,則在FixupCollection中相同。

+0

我試過這個沒有運氣。 – muruge 2011-03-07 23:25:51