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);
}
}
}
ポインタをいただければ幸いです。