2012-01-31 7 views
0

私は、PersonオブジェクトのJSON連載リストを提供する「読み込み」メソッドを持つWCF Webサービスを持っています。これらのPersonオブジェクトのそれぞれは、それぞれのStatusオブジェクトによって表される特定のステータスを有する。これは、Entity Frameworkによって外部キー関係としてマップされます。ASP.NET/WCF:JSON外部キーを実際のオブジェクトに戻す

JSON出力の場合、各PersonのStatusを完全なネストされたオブジェクトとしてシリアル化する必要はありません。代わりに、Webサービスにそれぞれの "ステータスID"を含めることを望みました。

[DataContract] 
public class Status 
{ 
    public Status() {} 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [DataMember(Name = "StatusId")] 
    public int StatusId { get; set; } 

    [DataMember(Name = "Description")] 
    public string Description { get; set; } 
} 


[DataContract] 
public class Person 
{ 
    public Person() {} 

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [DataMember(Name = "PersonId")] 
    public int PersonId { get; set; } 

    [DataMember(Name = "Name")] 
    public string Name { get; set; } 

    public Status Status { get; set; } 

    [DataMember(Name = "StatusId")] 
    [NotMapped] 
    public int JsonStatusId 
    { 
     get 
     { 
      if (Status == null) return -1; 
      return Status.StatusId; 
     } 
     set {} 
    } 
} 

そして、次のように私のWebサービスメソッドになります:それは私がそれをやった方法です

[OperationContract] 
[WebGet] 
public List<Person> Persons() 
{ 
    return _dbContext.Persons. 
     Include(person => person.Status) 
     Select(person => person). 
     ToList(); 
} 

これまでのところ、すべてが素晴らしい作品ということ。しかし、私のWebAppがエンティティの1つに対して更新要求を送信するとき、StatusIdを実際のStatusオブジェクトにマップする方法はわかりません。つまり、変更されたStatusIdを持つ更新されたPersonオブジェクトを含むJSONリクエストを取得します。正しいStatusオブジェクトを参照するPersonオブジェクトを受け取る適切な方法はありますか?

は、事前にすべてのいただきありがとうござい フロリアン

答えて

0

をあなたは少しあなたの既存のソリューションを変更する必要がありますを意味し、あなたの現在のソリューションはかなり良いですが、私はあなたがここにいくつかのオプションを持っていると思います。

  • ステータスとステータスIDの両方を常にシリアル化します。つまり、ステータスをDataMemberとしてマークします。 StatusIdだけを直列化したいのですが、Statusをシリアル化すると処理時間が大幅に増えることはありません。ステータスを気にかけたり理解したりしないクライアントは、それらをすべてスキップできます。

  • デシリアライゼーションコールバック(OnDeserializing/OnDeserialized)と拡張データオブジェクト(IExtensibleDataObject、別名「拡張データ」)を使用してください。タイプが理解できないデータ(ステータス情報など)がデシリアライズされて「拡張データバッグ」になります。デシリアライゼーションコールバックは、このデータを調べて、ワイヤに存在しているように見える場合はステータスを設定します。

  • は、動的に既知の型を解決するために、データコントラクトリゾルバー(DataContractResolver)を使用し

  • ステータスオブジェクトは、他のタイプに前後に翻訳され得ることができるように

    、データコントラクトサロゲート(IDataContractSurrogate)を使用します。 MSDNとのStackOverflowに加えて

、私はまた、WCFのチームメンバーからthis blogをお勧めします。これらのシリアライゼーション・コーナー・ケースの拡張性の点をすべて詳細に詳しく説明しています。

0

あなたの問題は、このです:

[DataMember(Name = "StatusId")] 
[NotMapped] 
public int JsonStatusId 
{ 
    get 
    { 
     if (Status == null) return -1; 
     return Status.StatusId; 
    } 
    set {} 
} 

だけセットを実装し、何かのように:

[DataMember(Name = "StatusId")] 
[NotMapped] 
public int JsonStatusId 
{ 
    get 
    { 
     if (Status == null) return -1; 
     return Status.StatusId; 
    } 
    set 
    { 
     var _dbContext= new entities() 
     Status = _dbContext.Statuses.First(p => p.Id == value); 
    } 
}