0

У меня есть следующие классы в моем приложении:ASP.NET Web API ядра чванство документы некорректные с эталонным контуром между классами

public class Person 
{ 
    public int Id { get; set; } 
    public Guid PublicKey { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public virtual List<Order> Orders { get; set; } 
} 

public class Order 
{ 
    public int Id { get; set; } 
    public DateTime Date { get; set; } 
    public virtual Person Person { get; set; } 
    public int PersonId { get; set; } 
} 

и следующий контроллер API, который просто получает список всех людей (есть всегда 2, и они всегда имеют 3 заказов каждый):

[Route("api/[controller]")] 
public class PeopleController : Controller 
{ 
    // GET api/people 
    [HttpGet] 
    public List<Person> Get() 
    { 
     PeopleService people = new PeopleService(); 

     return people.GetAllPeople(); 
    } 
} 

Я должен отметить, что у меня были проблемы с самого начала с навигационной собственности на классе Order, ссылаясь обратно на лицо, которое владеет им, как Json .NET formatter не нравится это из коробки, и вам нужно настроить чтобы игнорировать опорные петли. Я делал это в Startup.cs так:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc() 
     .AddJsonOptions(o => 
     { 
      o.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.None; 
      o.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 
     }); 

    services.AddSwaggerGen(); 
} 

Это прекрасно работает, и когда я делаю запрос я получаю следующий ответ:

[ 
    { 
     "orders": [ 
      { 
       "id": 1, 
       "date": "2016-10-26T17:16:35.21", 
       "personId": 1 
      }, 
      { 
       "id": 2, 
       "date": "2016-10-26T17:16:35.21", 
       "personId": 1 
      } 
     ], 
     "id": 1, 
     "publicKey": "b6a7c21c-86d8-4bb9-9a05-bd394e6ed0c9", 
     "firstName": "Lauren", 
     "lastName": "Phillips" 
    }, 
    { 
     "orders": [ 
      { 
       "id": 3, 
       "date": "2016-10-26T17:16:35.21", 
       "personId": 2 
      }, 
      { 
       "id": 4, 
       "date": "2016-10-26T17:16:35.21", 
       "personId": 2 
      } 
     ], 
     "id": 2, 
     "publicKey": "8b5a90b4-a9a2-4a0e-96dd-529962972456", 
     "firstName": "Robert", 
     "lastName": "West" 
    } 
] 

Я использую Swashbuckle генерировать чванство документы для моего API. «Пример значение», который генерируется Swashbuckle/Swagger, как представляется, в том числе человека снова в каждом порядке:

[ 
    { 
     "id": 0, 
     "publicKey": "string", 
     "firstName": "string", 
     "lastName": "string", 
     "orders": [ 
      { 
       "id": 0, 
       "date": "2016-10-27T14:19:52.437Z", 
       "person": { 
        "id": 0, 
        "publicKey": "string", 
        "firstName": "string", 
        "lastName": "string", 
        "orders": [ 
         {} 
        ] 
       }, 
       "personId": 0 
      } 
     ] 
    } 
] 

Я не хочу, чтобы люди, потребляющие API ожидать, что человек будет снова включен в каждом заказе , особенно, поскольку это не то, что вы на самом деле получаете, потому что я настроил его, чтобы игнорировать опорные циклы выше. Я предполагаю, что эта проблема связана с эталонным циклом, но я не уверен. Кто-нибудь знает, как это исправить?

ответ

0

Возможно, вы можете использовать атрибут - [JsonIgnore] не показывают, что в документации развязности

+0

Спасибо, что делает работу, но человек будет навсегда остался из заказов. Вполне возможно, что в какой-то момент мне нужно получить конкретный порядок и ожидать, что с ним придет Человек. Я ценю, что мне сложно, я только начинаю большой проект и хочу все это выработать, прежде чем я снова буду решать свои проблемы. – Ben

+0

@Ben, я не уверен, почему у вас снова есть объект Person, на который ссылается класс Order. Но если объект Order никогда не будет иметь свойство Person, если его ссылается из контекста класса Person, тогда вы можете разделить Order на два класса - OrderBasicDetails (имя может быть любым, что имеет смысл) и Order. OrderBasicDetails будет иметь все атрибуты, кроме класса Person и Order, наследуется от Basic и будет иметь атрибут person. –

+0

Я, хотя в ООП был довольно стандартным для обеспечения навигационных свойств между родительским и дочерним объектами, он позволяет очень просто перемещаться по объектам. В этом случае они являются сущностными сущностными сущностями, поэтому ссылка из заказа обратно человеку фактически представляет собой отношение внешнего ключа – Ben