2017-02-16 3 views
0

Ich versuche, OData zu verwenden, und ich habe ein Problem mit der Verwendung der $ expand-Funktion.OData kann nicht erweitert werden

Ich habe 3 Einheiten: Event, Ordnung, Ticket

Sie sind Setup wie folgt aus: Veranstaltung:

public int Id { get; set; } 
    public string UserId { get; set; } 
    public string Name { get; set; } 
    public string ShopName { get; set; } 
    public string ImageUrl { get; set; } 
    public string Description { get; set; } 
    public DateTimeOffset Start { get; set; } 
    public DateTimeOffset End { get; set; } 
    public virtual ICollection<Order> Orders { get; set; } = new Collection<Order>(); 

Auftrag:

public int Id { get; set; } 
    [ForeignKey("Event")] 
    public int EventId { get; set; } 

    public string CustomerFirstName { get; set; } 
    public string CustomerLastName { get; set; } 
    public string CustomerEmail { get; set; } 
    public string CustomerPhoneNumber { get; set; } 
    public string CustomerAddress { get; set; } 
    public string CustomerHouseNumber { get; set; } 

    public string TransactionId { get; set; } 
    public TransactionStatus Status { get; set; } 

    public DateTimeOffset OrderedOn { get; set; } 

    public virtual Event Event { get; set; } 
    public virtual ICollection<Ticket> Tickets { get; set; } = new Collection<Ticket>(); 

Ticket:

public int Id { get; set; } 

    [ForeignKey("Order")] 
    public int OrderId { get; set; } 

    public string Barcode { get; set; } 

    public virtual Order Order { get; set; } 

Wenn ich ein Ereignis abrufen und Aufträge erweitern und dann auch Tickets erweitern möchte, gibt es kein Problem. Solange ich Event als Ausgangspunkt benutze.

Wenn ich jedoch einen Auftrag auswähle (was gut funktioniert) und Tickets erweitern möchte, erhalte ich den folgenden Fehler: "'DbQuery`1' kann nicht mit dem ODataMediaTypeFormatter serialisiert werden."

Auch dies geschieht NUR, wenn ich die Tickets für eine bestimmte Bestellung abrufen möchte. Wenn ich das Event auswähle und von dort expandiere, funktioniert alles gut.

Weiß jemand, was ich falsch mache? Ich kann es nicht herausfinden.

Antwort

0

Sie sollten 2 Dinge implementieren:

1) Sie sollten ODataConventionModelBuilder in Kombination mit MapODataServiceRoute verwenden. So Ihre OData-Konfiguration in ändern:

 var builder = new ODataConventionModelBuilder(); 
     config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); 
     builder.EntitySet<Ticket>("Tickets"); 
     builder.EntityType<Ticket>().HasKey(x => x.Id); 
     builder.EntitySet<Order>("Orders"); 
     builder.EntityType<Order>().HasKey(x => x.Id); 
     builder.EntitySet<Event>("Events"); 
     builder.EntityType<Event>().HasKey(x => x.Id); 
     IEdmModel model = builder.GetEdmModel(); 
     config.MapODataServiceRoute("ODataRoute", "odata", model); 

ODataConventionModelBuilder verwendet wird, automatisch zu einem EDM-Modellklassen abzubilden.

2) Setzen Sie diese in Ihre OData Orders Controller:

public class OrdersController : ODataBaseController 
{ 
    ODataValidationSettings settings = new ODataValidationSettings() 
    { 
     AllowedFunctions = AllowedFunctions.AllFunctions 
    }; 

    [EnableQuery] 
    public IHttpActionResult Get(ODataQueryOptions<Order> options) 
    { 
     try 
     { 
      options.Validate(settings); 
      return Ok(dbContext.Orders); 
     } 
     catch (Exception ex) 
     { 
      return BadRequest(ex.Message); 
     } 
    } 

}

Verwandte Themen