1

我正在使用使用 Microsoft.AspNetCore.Odata v7.4.0 NuGet 的 ASP.NET Core 3.1x API,并且我有一个使用 Simple.OData.V4.Client v5 的 ASP.NET Core 3.1v Web 客户端.12.0

我正在尝试从 Simple.Odata 客户端发布带有相关 LineItem 对象(主/详细信息)的 Order 对象。Order 对象被正确地传递给 API,但相关的 LineItem 集合却没有。

这是我的订单课程;

public class Order
{
    public Guid Id { get; set; }
    public DateTimeOffset DateOfOrder { get; set; }
    public string PurchaseOrderNumber { get; set; }
    public decimal Subtotal { get; set; }
    public decimal Discount { get; set; }
    public decimal Shipping { get; set; }
    public decimal SalesTax { get; set; }
    public decimal Total { get; set; }
    public List<OrderLineItem> OrderLineItems { get; set; } = new List<OrderLineItem>();
}

这是我的 OrderLineItem 类;

public class OrderLineItem : BaseModel
{
    public Guid Id { get; set; }
    public Guid OrderId { get; set; }
    public Order Order { get; set; }
    public Guid ProductId { get; set; }
    public string ProductName { get; set; }
    public int Quantity { get; set; }
    public decimal UnitPrice { get; set; }
    public decimal Discount { get; set; }
    public decimal Total { get; set; }
}

这是客户端网站应用程序的我的 ODataService 中的方法;

public async Task<Result<Order>> CreateOrderAsync(Order req, CancellationToken cancellationToken)
{
    try
    {
        var baseUrl = cdUtilities.GetBaseApiUrl();
        var accessToken = await GetAccessToken();
        var client = new ODataClient(SetODataToken(baseUrl, accessToken));
        var response = await client.For<Order>()
            .Set(req).InsertEntryAsync(cancellationToken);
        return Result.Ok(response);
    }
    catch (WebRequestException badRequest)
    {
        var odataErrorResponse = JsonConvert.DeserializeObject<ExceptionResponse>(badRequest.Response);

        var errorMessage = $"Bad Request: The API returned an HTTP Status Code 400.{Environment.NewLine}";

        if (odataErrorResponse.Error != null)
        {
            foreach (var errorDetail in odataErrorResponse.Error.Details)
            {
                errorMessage = $"{errorMessage}  {errorDetail.Message}{Environment.NewLine}";
            }
        }

        logger.LogError(badRequest, errorMessage);
        return Result.Fail<Order>(errorMessage);
    }
    catch (Exception ex)
    {
        logger.LogError(ex, ex.Message);
        return Result.Fail<Order>(ex.Message);
    }
}

这是我在 Postman 中使用的 Order 对象的 json 和相关的 OrderLineItem 对象,它们与我的 API 一起正常工作。

{
    "@odata.context": "https://localhost:44367/v1/$metadata#Orders",
    "DateOfOrder": "2020-05-14T08:00:43.511Z",
    "PurchaseOrderNumber": "P051420200001",
    "Subtotal": 450.00,
    "Discount": 0.00,
    "Shipping": 3.45,
    "SalesTax": 28.00,
    "Total": 495.89,
    "OrderLineItems": [
        {
            "ProductId": "BF43F1C7-6796-4C92-B4DD-08D7DBE4BBCC",
            "ProductName": "Test Product 2",
            "Quantity": 6,
            "UnitPrice": 53.00,
            "Discount": 0.00,
            "Total": 318.00,
            "Length": 10.0,
            "Width": 4.0,
            "Height": 7.0,
            "Weight": 0.302,
            "DimUnit": "Inch",
            "WeightUnit": "Pound",
            "Status": "Active",
            "DeleteFlag": false
       }
    ]
}

当我使用 Postman 发布带有相关 OrderLineItems 的新订单时,我的 API 会很好地创建订单和相关的 OrderLineItem 记录。但是,当我使用 Simple.OData.V4.Client 发布时,会创建 Order 记录,但不会创建相关的 OrderLineItem 记录。

当我通过 Postman 发布记录时查看 OData API 控制器时,我可以看到 Order 对象与包含的 OrderLineItems 一起传入。

但是,当我在我的 Web 应用程序中使用 Simple.OData.V4.Client 时查看 OData API 控制器时,我看到 OrderLineItems 的计数为 0,因此 Simple OData 客户端没有发送相关的 OrderLineItem 记录,甚至虽然我可以在 Order 对象中看到它们,该对象传递给 Web 应用程序的 OData 服务中的 CreatreOrderAsync 方法。

因此,我必须假设我缺少简单 OData 客户端所需的东西以允许它包含相关记录,但是在查看简单 OData 客户端文档后,我找不到主/详细类型客户端 Post 方法的示例。

我在这里想念什么?

***** 20 年 5 月 14 日更新 *****

Simple.Odata.Client 不支持深度链接(在单个操作中具有真实数据的模型)。Microsoft 有一个正在积极更新的 OData 客户端,它确实支持相关数据。它更复杂但似乎也更灵活(即 ODataClientFactory 和 DI 支持)。这是文档的链接

Microsoft 客户端让我想起了我们在 WCF 中必须做的事情,因为我们使用 Connected Services 设置代理并链接到 Visual Studio 中的 API 元数据。我确实喜欢它们支持 LINQ 查询,而且我喜欢 IOdataClientFactory 这样我们就可以在没有实际网络调用的情况下进行单元测试。

4

0 回答 0