0

Ich habe die folgenden Klassen in meiner Anwendung:ASP.NET Core-Web-API Swagger docs falsch mit Referenzschleife zwischen den Klassen

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; } 
} 

und der folgenden API-Controller, der eine Liste aller Menschen wird immer (es gibt immer 2, und sie haben immer drei Aufträge pro Stück):

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

     return people.GetAllPeople(); 
    } 
} 

ich mag darauf hinweisen, dass ich mit der Navigationseigenschaft auf den Bestellklassenfragen hatte von Anfang an auf der Person beziehen zurück, die sie besitzt, als Json .NET Formatierer mag dies nicht out of the box und Sie müssen konfigurieren um Referenzschleifen zu ignorieren. Ich habe dies wie so in der Startup.cs getan:

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(); 
} 

Dies funktioniert gut, und wenn ich eine Anfrage ich die folgende Antwort erhalten:

[ 
    { 
     "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" 
    } 
] 

ich Swashbuckle bin mit Swagger docs zu erzeugen für meine API. Der „Beispielwert“, die von Swashbuckle/Swagger erzeugt wird, scheint in jeder Reihenfolge der Person wieder darunter zu:

[ 
    { 
     "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 
      } 
     ] 
    } 
] 

Ich will die Leute nicht über die API raubend die Person zu erwarten, wieder in jeder Reihenfolge aufgenommen werden vor allem, weil das nicht das ist, was du tatsächlich bekommst, weil ich es so konfiguriert habe, dass es Referenz-Loops ignoriert. Ich stelle mir vor, dass dieses Problem mit der Referenzschleife zusammenhängt, aber ich bin mir nicht sicher. Kann jemand das beheben?

Antwort

0

Wahrscheinlich können Sie die Attribut - [JsonIgnore] nicht, dass in der Prahlerei Dokumentation

+0

Dank zeigen, das funktioniert, aber die Person wird dann für immer aus den Aufträgen bleiben. Es kann gut sein, dass ich irgendwann eine bestimmte Bestellung bekommen muss und erwarte, dass die Person mitkommt. Ich weiß es zu schätzen, dass ich schwierig bin, ich fange gerade ein großes Projekt an und möchte all diese Dinge erarbeiten, bevor ich später meine eigenen Probleme verursache. – Ben

+0

@Ben, ich bin mir nicht sicher, warum Sie wieder Person-Objekt in der Order-Klasse verwiesen haben. Wenn das Objekt "Order" jedoch niemals eine Personeneigenschaft hat, wenn es aus dem Kontext der Personenklasse referenziert wird, können Sie Order in zwei Klassen aufteilen - OrderBasicDetails (Name kann alles sein, was Sinn macht) und Order. OrderBasicDetails verfügt über alle Attribute mit Ausnahme der Klasse "Person" und "Order", die von Basic geerbt werden und über das Attribut "person" verfügen. –

+0

Obwohl es in OOP ziemlich Standard war, um Navigationseigenschaften zwischen Eltern- und Kind-Objekten bereitzustellen, ermöglicht es sehr einfaches Traversieren von Objekten. In diesem Fall sind sie beide Entitätsframework-Entitäten, so dass die Referenz von Bestellung zurück zu Person tatsächlich die Fremdschlüsselbeziehung darstellt – Ben

Verwandte Themen