2012-02-06 16 views
4

エンティティの子を返しません。その下で、カスタムPOCOエンティティを回すために、Entity FrameworkとObjectContextを使用して単純なエンティティモデルを構築しました。私は単一のエンティティを渡すと、予想通りWCF RESTサービスは、私がJSONに設定defaultOutgoingResponseFormatを持つRESTテンプレートでWCFサービスを書かれている

は、システムが動作します。エンティティに子を追加すると、REST応答は空白になります。デバッガでは、エンティティは正しく設定されますが、サービス自体は何も返しません。

ので、例えば、私はTrip.Get()メソッドを持っています。 WCFコードは次のようになります

Library.Trip.Getは作業バージョンにこのようになり
[WebGet(UriTemplate = "{id}", ResponseFormat = WebMessageFormat.Json)] 
public Model.Trip Get(string id) 
{ 
    Model.Trip fetchedTrip = null; 
    try 
    { 
     fetchedTrip = Library.Trip.Get(new Guid(id)); 
    } 
    catch (Exception ex) 
    { 
     Debug.Write(ex.Message); 
    } 
    return fetchedTrip; 
} 

public static Model.Trip Get(Guid tripId) 
{ 
    using (Model.POCOTripContext context = new Model.POCOTripContext()) 
    { 
     var tripEntity = context.Trips.FirstOrDefault(c => c.Id == tripId) ?? new Model.Trip(); 
     return tripEntity; 
    } 
} 

これは予想される結果を返し、次のようになります

{ "ArrivalDate": "/日(1334203200000-0400)/"、 "DepartureDate": "/日(1334721600000-0400)/"、 "ID": "d6413d96-fe1f-4b1c-ae7a-3bbf516cdc2f"、 "名前": "テスト123"、 "写真":ヌル、 "PlacesOfInterest":ヌル、 "WhereTo": "オーランド、フロリダ州"}

ただし、子に追加するようにライブラリメソッドを変更した場合、RESTサービスは空白の値を返します。何もない。

public static Model.Trip Get(Guid tripId) 
{ 
    using (Model.POCOTripContext context = new Model.POCOTripContext()) 
    { 
     var tripEntity = context.Trips.Include("PlacesOfInterest").Include("Photos").Include("PlacesOfInterest.PoiAttributes").FirstOrDefault(c => c.Id == tripId) ?? new Model.Trip(); 
     return tripEntity; 
    } 
} 

デバッガーは、returnステートメントのWCFサービスで、エンティティが完全に正しく入力されていることを示します。

私はいくつかの魔法の属性が不足していると確信しており、これまでにドームを持っている人が私を助けてくれることを期待しています!

+1

からプロパティを除外する[IgnoreDataMember]属性でナビゲーションプロパティを追跡バックマークはPlacesOfInterest' 'で' Trip'または 'Trips'のナビゲーションプロパティはありますか?はいの場合はそれを削除して(テスト用)、もう一度試してみてください。 –

+0

これを行うと、他のすべての関係が壊れてしまいます。マイナーな手術をして、あなたに戻ってきてください。 –

+0

それはそれをしました!私はupvoteの良さであなたをシャワーことができるように答えを作る!レコードの –

答えて

6

バックトラッキングナビゲーションプロパティを削除した小さなテストによれば、JSONのシリアル化に問題があります。デフォルトのシリアライゼーションはオブジェクト参照を追跡することができないため、Tripのシリアライズを開始すると、ポイントのナビゲーションプロパティの後に最初にTripが参照されます。参照を追跡しないので、ナビゲーションプロパティの後に戻り、再びトリップをシリアライズします(そして彼のナビゲーションプロパティに再び従います)=>無限ループ。

テストで行ったようにバックトラッキングナビゲーションプロパティを削除するか、シリアライザに参照を追跡するか、そのプロパティをシリアル化から除外する必要があります(よくわかりませんが、最初のオプションがJSON)。参照の追跡を開始する

  • マーク・各エンティティ[DateContract(IsReference = true)][DataMember]属性を持つ各シリアル化されたプロパティを持つ:私はどちらかのように、あなたはデフォルトWCFのシリアル化を使用していると思います。
  • またはシリアライズ
+0

は、私はすべてのナビゲーションプロパティの[IgnoreDataMember]属性を追加することを決定し、それが完璧に動作します。 –

関連する問題