提问人:Waz 提问时间:11/16/2023 最后编辑:marc_sWaz 更新时间:11/16/2023 访问量:35
Entity Framework Core POST 错误(无法转换 JSON 值)
Entity Framework Core POST error (JSON value could not be converted)
问:
我有以下实体:
public class Order
{
public int Id { get; set; }
public string Name { get; set; }
public OrderGroup OrderGroup { get; set; }
}
public class OrderGroup
{
public int Id { get; set; }
public string Name { get; set }
public Order Order { get; set; }
}
当我请求 时,我在 Swagger 中收到错误:POST
Order
“订单”字段为必填项
JSON 值无法转换为 <API。Entities.Order> .路径:$。订单组.order |
这是有道理的,因为如果我在有效负载 () 中更改为 null,我能够修复错误。但是我需要它,所以可以选择有一个(所以我应该能够创建一个没有)。OrderGroup.order
Order
OrderGroup
Order
OrderGroup
解决这个问题的最佳方法是什么?
是否有注释来处理这个问题,或者我会做这个客户端。我说注释,因为我还没有使用模型构建器。
这是一对一的关系。
我试过了:
- 在有效负载上更改为 null 有效,但需要正确处理此问题
- 也添加到 ,但仍然抛出相同的错误
?
OrderGroup
Order
答:
避免此类问题的最简单建议是避免在服务器和客户端之间发送实体。
要使 POST 创建订单,请定义类似于 CreateOrderViewModel 的内容:
[Serializable]
public class CreateOrderViewModel
{
public string Name { get; set; }
public int? OrderGroupId { get; set; }
}
然后在控制器中:
[HttpPost]
public async Task CreateOrder(CreateOrderViewModel viewModel)
{
ArgumentNullException.ThrowIfNull(viewModel, nameof(viewModel));
OrderGroup? orderGroup = viewModel.OrderGroupId.HasValue
? _context.OrderGroups.Single(x => x.Id == viewModel.OrderGroupId)
: null;
var newOrder = new Order
{
Name = viewModel.Name,
OrderGroup = orderGroup
};
_context.Orders.Add(newOrder);
await _context.SaveChangesAsync();
}
这假定订单可能属于 OrderGroup,也可能不属于 OrderGroup。这不是一对一的关系,而是多对一的关系。许多订单可能与订单组相关联。Order 表将包含 OrderGroupId。通过使 OrderGroupId 为 null,订单不需要具有 OrderGroup 关联。一对一关系通常共享相同的 PK,但 EF 可以使用单独的 FK 强制实施一对一关系,例如具有唯一约束的多对一关系。
传递实体会给关联与创建带来许多问题,因为实体都将分离,并且上下文最终可能会以现有引用导致错误。当填充并从视图发送到控制器时,它们可能“看起来像”实体,但它们只是复制到实体类实例中的值。它们可能不完整,如果对它们使用类似的东西,则可能会使用不可信的值覆盖数据。实体也是一个重量级类别,需要发送循环引用等问题,并且通常包含比完成工作真正需要的更多的数据。Update
评论