2016-02-01 2 views
0

IM сталкивается с проблемой с вероятно selfreference Looping: Модель:Web Api; Entity Framework; Данные возвращает рекурсивный

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 formatsettings, но не получал никаких лучших результатов.

+0

Похоже, вы жертва Js сериализации ходить весь граф объектов. Непонятно, что вы хотите. Вы вообще не хотите объектов ProtectedCount? Если вы посмотрите на http://stackoverflow.com/questions/10169648/how-to-exclude-property-from-json-serialization –

+0

Да, всегда лучше использовать DTO, а не отправлять объект базы данных непосредственно клиенту , – jvanrhyn

+0

@ Pr1m-e Я перечитал, и было ясно, но SO не позволит мне редактировать. Я в основном предлагаю добавить атрибут в ссылку ProtectedAccount внутри класса Member, но если у вас много вызовов 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(); 
Смежные вопросы