Как заставить ASP.Net Web API и OData связывать строковое значение в качестве ключа?

изучаю краткое руководство по веб-API + OData от asp.net:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/getting-started-with-odata-in-web-api/create-a-read-only- OData конечных точек.

Я скачал пример проекта, и он работает. Но потом я начал играть сProduct модель, которую они используют в примере. Я добавил новое свойство, которое будет действовать как ключ типа string вместо целочисленного ключа.

Новый Product.cs:

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

Модифицированный контроллер:

public class ProductsController : EntitySetController
{
    static List products = new List()
    {
        new Product() { stringKey = "one", ID = 1, Name = "Hat", Price = 15, Category = "Apparel" },
        new Product() { stringKey = "two", ID = 2, Name = "Socks", Price = 5, Category = "Apparel" },
        new Product() { stringKey = "three", ID = 3, Name = "Scarf", Price = 12, Category = "Apparel" },
        new Product() { stringKey = "four", ID = 4, Name = "Yo-yo", Price = 4.95M, Category = "Toys" },
        new Product() { stringKey = "five", ID = 5, Name = "Puzzle", Price = 8, Category = "Toys" },
    };

    [Queryable]
    public override IQueryable Get()
    {
        return products.AsQueryable();
    }

    protected override Product GetEntityByKey(string key)
    {
        return products.FirstOrDefault(p => p.stringKey == key);
    }
}

Беда в том, что когда я иду в/odata/Products(one) строка "один" не связан с ключевым аргументом вGetEntityByKey(string key) действие. Тем не менее, когда я просматриваюodata/Products(1) тогда "1" действительно связан сkey аргумент.

Как я могу получить строку с текстовыми значениями для правильного связывания, вместо того, чтобы просто связывать строки с числовыми значениями?

Обновить

Я забыл включить WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
        modelBuilder.EntitySet("Products");

        Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel();
        config.Routes.MapODataRoute("ODataRoute", "odata", model);
    }
}
 Padraic24 мар. 2017 г., 13:02
Я бы рекомендовал использовать Swagger (используя пакет Nuget Swashbuckle), чтобы показать пути API и помочь с генерацией запросов OData.

Ответы на вопрос(1)

Решение Вопроса

что путь / odata / Products (0011-1100) будет только связывать "0011" в качестве строкового ключа.

Поработав с ним, ямы обнаружили, что следующий путь работает так, как я надеялся:

/odata/Products('one')

Похоже, что одинарные кавычки необходимы для чтения всей строки в скобках.

 Ivan Nikitin19 мая 2015 г., 12:04
Получаете ли вы ключ какодин" или как "'один'" (с одинарными кавычками)?

Ваш ответ на вопрос