我有以下实体:
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
(所以我应该能够创建一个没有OrderGroup
的Order
)。
最好的办法是什么?
有注解来处理这个问题吗?或者我会在客户端处理这个问题吗?我说注解是因为我还没有使用过modelBuilder。
这是一对一的关系。
我试探着:
- 在有效负载上更改为null可以工作,但需要正确处理
- 还将
?
添加到OrderGroup
,Order
仍然抛出相同的错误
1条答案
按热度按时间unhi4e5o1#
避免此类问题的最简单建议是避免在服务器和客户端之间发送实体。
对于创建订单的POST,定义类似于MySQL OrderViewModel的东西:
字符串
然后在您的控制器中:
型
这假定订单可能属于,也可能不属于OrderGroup。这不是一对一关系,而是多对一关系。许多订单可能与订单组关联。Order表将包含OrderGroupId。通过将OrderGroupId设置为空,订单不需要具有OrderGroup关联。一对一关系通常共享相同的PK,尽管EF可以像具有唯一约束的多对一一样,利用单独的FK来实施一对一。
传递实体会给关联和创建带来很多问题,因为实体都将被分离,上下文可能会与现有的引用一起导致错误。当从视图填充并发送到控制器时,它们可能“看起来”像实体,但它们只是复制到实体类的示例中的值。它们可能不完整,如果你使用类似
Update
的东西,你可以使用不可信的值来创建数据。实体也是一个重量级的类,会发送像循环引用这样的问题,而且通常包含比完成工作真正需要的更多的数据。