2015-02-26 18 views
5

Ich möchte dieses Objekt zurückzugeben, indem es von seinem Namen zu finden:Objekt kann nicht zurückkehren

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
    public string Category { get; set; } 
} 

Die Controller-Methode ist:

[HttpGet] 
[ODataRoute("Products/ProductService.GetByName(Name={name})")] 
public IHttpActionResult GetByName([FromODataUri]string name) 
{ 
    Product product = _db.Products.Where(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase)).SingleOrDefault(); 
    if (product == null) 
    { 
     return NotFound(); 
    } 

    return Ok(product); 
} 

Und die WebApiConfig.Register() Methode ist:

public static void Register(HttpConfiguration config) 
{ 
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
    builder.EntitySet<Product>("Products"); 

    builder.Namespace = "ProductService"; 
    builder.EntityType<Product>().Collection.Function("GetByName").Returns<Product>().Parameter<string>("Name"); 

    config.MapODataServiceRoute(routeName: "ODataRoute", routePrefix: null, model: builder.GetEdmModel()); 
} 

Durch den Aufruf http://http://localhost:52542/Products(1) bekomme ich das Produkt mit der ID 1 wie erwartet:

{ 
"@odata.context":"http://localhost:52542/$metadata#Products/$entity","Id":1,"Name":"Yo-yo","Price":4.95,"Category":"Toy" 
} 

Aber wenn ich rufe http://http://localhost:52542/Products/ProductService.GetByName(Name='yo-yo') Ich kann in die Steuerung Funktion debuggen tun und das Ergebnis zurückgegeben wird, aber ich erhalte eine Fehlermeldung im Browser, dass An error has occurred. sagen. Die Nachricht lautet The 'ObjectContent 1' type failed to serialize the response body for content type 'application/json; odata.metadata=minimal'. und die innere Ausnahme ist The related entity set or singleton cannot be found from the OData path. The related entity set or singleton is required to serialize the payload..

Was ist hier falsch?

Antwort

5

Ihre Funktionskonfiguration hat ein Problem. Sie sollten wie folgt nennen die Rückkehr zu definieren:

builder.EntityType<Product>().Collection.Function("GetByName").ReturnsFromEntitySet<Product>("Products").Parameter<string>("Name"); 

Dann kann es funktionieren. Vielen Dank.

+0

Also das hat funktioniert! Vielen Dank. Ich sehe jetzt den Unterschied zwischen meinem Code und deinem Code. –

+2

Ich finde, dass das Lernen, wie man 'ODataConventionModelBuilder' richtig benutzt, keine kleine Aufgabe ist. Ich spüre die Produktivität nicht so sehr – bkwdesign

Verwandte Themen