2012-06-20 53 views
0

我最近在遇到一个涉及返回对象图的Web API项目时遇到了(希望)小问题,以便它们可以被读为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中,我要求的特定任务(凭身份证)一起,通过:单任务请求的

//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 : []

我确定有很多方法可以解决这个问题 - 我只是想我会对人们认为是最好的处理方法有所了解。

考虑方法(到目前为止):

  • 使用其它的JSON解析器(如Newtonsoft.JSON),它固定在整个返回数据的问题,但附加的$ id和$裁判,这可能我相信难以解析Knockout。

  • 使用投影和利用匿名类型返回数据。 (目前为止未测试)

  • 删除完全包含并仅通过其他请求访问子数据。

任何和所有的建议将不胜感激。

回答

3

我最近在EF类型和Web API方面有类似的问题。根据您生成的EF模型的设置方式,导航属性可能会导致循环依赖。所以如果你生成的Activity类有一个Task引用,序列化程序将试图走对象图,并引发一个不好的周期。

一个解决方案是创建一个简单的视图模型来获得串行工作

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!! 
} 

取决于你在做什么,你甚至可以创建一个比这更平坦的模型,但去掉任务参考将有助于序列化。这可能就是为什么它活动时空的工作

+0

谢谢塞西尔 - 我会寻找尝试沿着这些线路看看事情是怎么回事。 –