Синтаксис расширения OData v4 возвращает ошибку «... Свойство ProductType нельзя использовать в параметре запроса $ expand». - PullRequest
0 голосов
/ 02 апреля 2019

У меня новая служба OData V4, которую я пытаюсь запустить, и я вижу неожиданную ошибку ...

"Свойство ProductType нельзя использовать в $разверните опцию запроса. "

У меня не было проблем с этим в другой службе OData, и я сравнивал два из них, и я не могу найти существенную разницу между двумя WRT настройкойэлементы в модели и WebApiConfig.Я построил это, следуя примеру, изложенному в статье create-an-odata-v4-endpoint , тогда как другой был создан с помощью мастера скаффолдинга.

Итак, вот схема таблиц, контроллеры и WebApiConfig.Где еще я могу найти причину неудачи в связывании?

enter image description here

// Product.cs
public partial class Product
{
    public int ProductId { get; set; }
    public int ProductTypeId { get; set; }
    public string Size { get; set; }
    public string PartNo { get; set; }

    public virtual ProductType ProductType { get; set; }
}

// ProductType.cs
public partial class ProductType{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]    public     ProductType()
    {
        this.Products = new HashSet<Product>();
    }
    public int ProductTypeId { get; set; }
    public string ProductTypeName { get; set; }
    public string Image { get; set; }
    public string ProductDescription { get; set; }
    public string InstallInstructions { get; set; }
    public string DataSheet { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Product> Products { get; set; }
}

// WebApiConfig.cs
public static void Register(HttpConfiguration config)
{
    // Web API configuration and services

    // Web API routes
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

    config.SetTimeZoneInfo(TimeZoneInfo.Utc);

    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

    builder.EntitySet<Product>("Products");
    builder.EntityType<Product>().HasKey(entity => entity.ProductId);
    builder.EntityType<Product>().HasRequired(entity => entity.ProductType, (entity, targetEntity) => entity.ProductTypeId == targetEntity.ProductTypeId);
    builder.EntitySet<ProductType>("ProductTypes");
    builder.EntityType<ProductType>().HasKey(entity => entity.ProductTypeId);
    builder.EntityType<ProductType>().HasMany(entity => entity.Products);

    config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

}

// ProductTypesController.cs
public class ProductTypesController : BaseController
{
    [EnableQuery]
    public IQueryable<ProductType> Get()
    {
        return db.ProductTypes;
    }

    [EnableQuery]
    public SingleResult<ProductType> Get([FromODataUri] int key)
    {
        IQueryable<ProductType> result = db.ProductTypes.Where(p => p.ProductTypeId.Equals(key));
        return SingleResult.Create(result);
    }
    ....
}

// ProductsController.cs
public class ProductsController : BaseController
{

    [EnableQuery]
    public IQueryable<Product> Get()
    {
        return db.Products;
    }

    [EnableQuery]
    public SingleResult<Product> Get([FromODataUri] int key)
    {
        IQueryable<Product> result = db.Products.Where(p => p.ProductId.Equals(key));
        return SingleResult.Create(result);
    }
    ...
}

Я испробовал оба способа ссылки на соответствующий элементс единичным и множественным выбором (введя эти URL-адреса в адресную строку): /ProductTypes?$expand=Products, /ProductTypes(3)?$expand=Products, /Products?$expand=ProductType и /Products(3)?$expand=ProductType Я получаю ту же ошибку в каждом случае.Если есть что-то еще, чтобы определить причину, я с удовольствием посмотрю это, мне просто нужно знать, где искать.

Спасибо, Майк

1 Ответ

0 голосов
/ 02 апреля 2019

Я нашел ответ в посте в выпусках odata github. issuecomment-248168536 Согласно этому комментарию, это новое поведение в пакете Microsoft.AspNet.OData версии 6.0.0 и является серьезным изменением.Я вернулся к другому работающему сервису и проверил пакет Nuget, в котором установлена ​​версия 5.6.0, а не последняя (сейчас 7.1.0).

Поэтому исправление заключается в добавленииСтрока конфигурации для функций, которые вы хотите перед отображением ...

config.Expand().Select();
config.MapODataServiceRoute("odata", null, builder.GetEdmModel());

Это исправление для включения опции в глобальном масштабе, чтобы она работала так же, как версии 13-01-modelbound-attribute ), который демонстрирует новую функцию гранулярного управления параметрами через атрибуты модели.

HTH, Mike

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...