2014-11-11 17 views
6

Ho un Api Web utilizzando odata v3, con alcune entità una chiave composta, come questo:odata v3 navigazione Web Api con chiave composita

public class AerodromoAdministracaoData 
{ 
    [Key] 
    [Column("idAerodromo", Order = 0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public short IdAerodromo { get; set; } 

    [Key] 
    [Column("data", Order = 1, TypeName = "date")] 
    public DateTime Data { get; set; }  

    public virtual Aerodromo Aerodromo { get; set; } 
} 

ho seguito this msdn article and created a NavigationRoutingConvention. L'applicazione gestisce ora le chiavi composite. Tuttavia, la navigazione Link come questo non funzionano:

http://localhost/WebApiV3/AerodromoAdministracaoData%28idAerodromo=1,data=%272014-10-24%27%29/Aerodromo 

Continuo a ricevere un "no risorsa HTTP è stato trovato che corrisponde alla richiesta", come se il metodo non è stato attuato nel controller. Tra l'altro, questo è il metodo di controllo:

[EnableQuery] 
    public Aerodromo GetAerodromo([FromODataUri] short idAerodromo, [FromODataUri] DateTime data) 
    { 
     AerodromoAdministracaoData result = Store.AerodromoAdministracaoData.Find(idAerodromo, data); 
     if (result == null) 
     { 
      throw new HttpResponseException(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NotFound)); 
     } 
     return result.Aerodromo; 
    } 

ho found this question parlando esattamente lo stesso problema, ma non ho capito come Nikon gestito la questione.

risposta

2

Eduardo

Da articolo di MSDN Support Composite Key in ASP.NET Web API OData

public class CompositeKeyRoutingConvention : EntityRoutingConvention 
{ 
    .... 
} 

La convenzione di routing sopra in grado di coprire i seguenti modelli di Uri:

  • ~/EntitySet/chiave
  • ~/EntitySet/chiave/cast

Ma, non può coprire ~/EntitySet/chiave/navigazione

La soluzione è semplice, basta derivato da NavigationRouteConvention come di seguito

public class CompositeKeyRoutingConvention : NavigationRoutingConvention 
{ 
    ... 
} 

Di seguito le informazioni di debug: The debug information:

assicurati: se si vuole supportare sia Uris:

  • /AerodromoAdministracaoData% 28idAerodromo = 1, data =% 272014-10-24% 27% 29
  • /AerodromoAdministracaoData% 28idAerodromo = 1, data =% 272014-10-24% 27% 29/Aerodromo

È necessario disporre di due convenzioni di routing personalizzate, una derivata da EntityRoutingConvention, l'altra derivata da NavigationRoutingConvention.

Spero che possa essere d'aiuto. Grazie.

Problemi correlati