0

私は最近、オブジェクトグラフをJSONとして読み取ることができるように返すことを含む、Web APIプロジェクトをいじくり回しているときに、(うまくいけば)小さな問題に遭遇しました。

タスクオブジェクトの例 (EFを介して生成)

//A Task Object (Parent) can consist of many Activities (Child Objects)
public partial class Task
{
    public Task()
    {
        this.Activities = new HashSet<Activity>();
    }

    public int TaskId { get; set; }
    public string TaskSummary { get; set; }
    public string TaskDetail { get; set; }

    public virtual ICollection<Activity> Activities { get; set; }
}

ApiController内で、特定のタスク(Idによる)とそれに関連するすべてのアクティビティが、次の方法で要求されます。

シングルタスクリクエストの例

//Simple example of pulling an object along with the associated activities.
return repository.Single(t => t.Id == id).Include("Activities");  

すべてが正常に機能しているように見えますが、URLに移動してこれにアクセスしようとすると/api/tasks/1、メソッドは正常に実行されますが、オブジェクトは返されません(単純な場合はそのページが見つかりません)。

アクティビティを含まないタスクをリクエストすると、すべてが期待どおりに機能し、適切なJSONオブジェクトが返されますActivities : []

この問題に取り組む方法はたくさんあると確信しています。私は、人々がこれを処理するための最良の方法をどのように考えているかについて、ある程度の洞察を得るだろうと思っていました。

考慮される方法(これまでのところ):

  • 問題を修正したが、戻りデータ全体に$idと$refを追加した代替のJSONパーサー(Newtonsoft.JSONなど)を使用すると、Knockoutの解析が困難になる可能性があると思います。

  • 射影を使用し、匿名型を利用してデータを返します。(これまでのところテストされていません)

  • インクルードを完全に削除し、別のリクエストを介して子データにアクセスするだけです。

ありとあらゆる提案をいただければ幸いです。

4

1 に答える 1

3

最近、EFタイプとWebAPIで同様の問題が発生しました。生成されたEFモデルの設定方法によっては、ナビゲーションプロパティによって循環依存が発生する場合があります。したがって、生成されたActivityクラスにタスク参照がある場合、シリアライザーはオブジェクトグラフをウォークし、少し厄介なサイクルでスローされます。

1つの解決策は、シリアライザーを機能させるための単純なビューモデルを作成することです。

public class TaskViewModel {
  public TaskViewModel ()
  {
     this.Activities = new List<ActivityViewModel>();
   }

  public int TaskId { get; set; }
  public string TaskSummary { get; set; }
  public string TaskDetail { get; set; }

  public virtual IList<ActivityViewModel> Activities { get; set; }
}

public class ActivityViewModel{
  public ActivityViewModel()
  {        
  }

  //Activity stuff goes here
  //No reference to Tasks here!!
}

実行していることによっては、これよりもフラットなモデルを作成できる場合もありますが、タスク参照を削除するとシリアル化に役立ちます。おそらく、アクティビティが空のときに機能したのはそのためです

于 2012-06-21T14:17:55.713 に答える