.net Entity Framework Core POST错误(无法转换JSON值)

j2cgzkjk  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(119)

我有以下实体:

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; }
}

字符串
当我对Order发出POST请求时,我在Swagger中得到一个错误:
订单字段为必填字段
无法将JSON值转换为<API.Entities.Order>。路径:$.OrderGroup.order|
这是有意义的,因为如果我在payload(OrderGroup.order)中更改为null,我可以修复错误。但是我需要它,这样Order就可以可选地拥有OrderGroup(所以我应该能够创建一个没有OrderGroupOrder)。
最好的办法是什么?
有注解来处理这个问题吗?或者我会在客户端处理这个问题吗?我说注解是因为我还没有使用过modelBuilder。
这是一对一的关系。
我试探着:

  • 在有效负载上更改为null可以工作,但需要正确处理
  • 还将?添加到OrderGroupOrder仍然抛出相同的错误
unhi4e5o

unhi4e5o1#

避免此类问题的最简单建议是避免在服务器和客户端之间发送实体。
对于创建订单的POST,定义类似于MySQL OrderViewModel的东西:

[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。这不是一对一关系,而是多对一关系。许多订单可能与订单组关联。Order表将包含OrderGroupId。通过将OrderGroupId设置为空,订单不需要具有OrderGroup关联。一对一关系通常共享相同的PK,尽管EF可以像具有唯一约束的多对一一样,利用单独的FK来实施一对一。
传递实体会给关联和创建带来很多问题,因为实体都将被分离,上下文可能会与现有的引用一起导致错误。当从视图填充并发送到控制器时,它们可能“看起来”像实体,但它们只是复制到实体类的示例中的值。它们可能不完整,如果你使用类似Update的东西,你可以使用不可信的值来创建数据。实体也是一个重量级的类,会发送像循环引用这样的问题,而且通常包含比完成工作真正需要的更多的数据。

相关问题