2016-02-01 29 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();