2016-02-01 82 views
0

IM面臨着可能selfreference循環的一個問題: 型號:Web Api;實體框架;數據返回遞歸

public class ProtectedAccount 
{ 
    public int Id { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public DateTime Created { get; private set; } 
    public DateTime? Changed { get; set; } 
    public bool Disabled { get; set; } 

    public virtual ICollection<ProtectedAccountMember> Members { get; set; } 
    public virtual ProtectedAccountType Type { get; set; } 
} 


public class ProtectedAccountMember 
{ 

    public int Id { get; set; } 
    [StringLength(300)] 
    public string Name { get; set; } 

    [Index] 
    public virtual ProtectedAccount ProtectedAccount { get; set; } 
} 

控制器:

[ResponseType(typeof(ProtectedAccount))] 
[Route("ProtectedAccounts/{id}/Members")] 
[HttpGet] 
public IHttpActionResult GetProtectedAccountMembers(int id) 
{ 
    var protectedAccount = db.ProtectedAccounts.Find(id); 

    if (protectedAccount == null) 
    { 
     return NotFound(); 
    } 

    return Ok(protectedAccount.Members.ToList()); 
    } 

數據至極我收到一個打通所有導航似乎循環遞歸:

[ 
    { 
    "ProtectedAccount": { 
     "Members": [ 
     { 
      "Id": 2, 
      "Name": "XXX, XX", 

     }, 
     { 
      "Id": 3, 
      "Name": "XX, XX", 

     } 
     ], 
     "Type": null, 
     "Id": 25, 
     "ObjectGUID": "76bf65e7-af60-4fe8-b3e1-90afbfd65b65", 
     "Name": "XXX", 

    }, 
    "Id": 1, 
    "Name": "test", 
    }, 
    { 
    "ProtectedAccount": { 
     "Members": [ 
     { 
      "Id": 1, 
      "Name": "test", 

     }, 
     { 
      "Id": 3, 
      "Name": "XX, XX", 
      "SamAccountName": "XX", 
      "Disabled": false 
     } 
     ], 
     "Type": null, 
     "Id": 25, 
     "ObjectGUID": "76bf65e7-af60-4fe8-b3e1-90afbfd65b65", 
     "Name": "XXXX", 

    }, 
    "Id": 2, 
    "Name": "XX, XX", 

    }, 
    { 
    "ProtectedAccount": {a 
     "Members": [ 
     { 
      "Id": 1, 
      "Name": "test", 
      "SamAccountName": "XXX", 
      "Disabled": false 
     }, 
     { 
      "Id": 2, 
      "Name": "XX, XX", 
      "SamAccountName": "XX", 
      "Disabled": false 
     } 
     ], 
     "Type": null, 
     "Id": 25, 
     "ObjectGUID": "76bf65e7-af60-4fe8-b3e1-90afbfd65b65", 
     "Name": "XXX", 
    }, 
    "Id": 3, 
    "Name": "XX, XX", 

    } 
] 

數據庫中只有一個「ProtectedAccount」。我必須使用DTO來解決這個問題嗎?我通過json格式設置嘗試了一些配置,但沒有得到更好的結果。

+0

看起來你是受害者,JSON序列化走在整個對象圖。目前還不清楚你想要發生什麼。你想不需要ProtectedCount對象?如果是這樣,請看http://stackoverflow.com/questions/10169648/how-to-exclude-property-from-json-serialization –

+0

是的,最好使用DTO而不是將數據庫對象直接發送到客戶端。 – jvanrhyn

+0

@ Pr1m-e我重新閱讀,很清楚,但是SO不會讓我編輯。我基本上是建議在Member類中的ProtectedAccount引用上添加屬性,但是如果您有很多API調用需要考慮,那麼DTO可能是要走的路子 –

回答

0

從你的代碼,你只returing的protectedAccount.Members,因此,你可以做一個投影查詢,如下

var results = ctx.ProtectedAccountMembers 
        .Where(member => member.ProtectedAccount.Id == protectedAccount.Id) 
        .Select(member => new { member.Id, member.Name }).ToList();