2012-06-20 65 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

謝謝塞西爾 - 我會尋找嘗試沿着這些線路看看事情是怎麼回事。 –