如何在 Web API 2 中明确表示 Entity Framework 仅添加已更改的对象部分?

How to make it explicit in Web API 2 for Entity Framework to only add parts of the object that have changed?

我正在使用 ASP.NET WebApi 2 并将部分关系数据库结构加载到前端网站中。这允许用户对单个商店中的多个 table 进行更改,还可以查看一些额外的数据。

这在大多数情况下都很好用。这意味着我可以在一个电话中存储更改,比如一个人 table 及其相关的衣服和头发颜色,如下所示:

 db.person.Add(person);
 db.SaveChanges();

问题是,我不想加载所有相关数据。所以鞋子 table 可以加载的地方,我不希望鞋带 table 加载有关鞋带的信息。

我 运行 遇到的问题是有人试图将重复的鞋子 table 存储到数据库,即使加载它只是为了允许用户查看这些详细信息。我想这是因为,我正在使用 [JsonIgnore] 属性来忽略对象的某些部分 - 因此当它不是时,它将识别为一个新对象。

我可以遍历对象,在调用 Add 之前删除任何鞋子信息,但这会很慢。

也许最好 post 第二个对象只包含已更改的项目(在前端跟踪这些项目之后)。有没有更好的方法?

当您在 EF 中使用 DbSet<T>.Add() 时,实体(或树中的所有实体,如果它是具有相关子实体的实体)附加到 DbContext 作为 Added.这意味着当您调用 SaveChanges 时,EF 将尝试将所有对象插入数据库中。这就是您遇到重复问题的原因。

您需要了解如何使用 EF 在断开连接模式下工作。基本上,您需要跟踪每个实体的状态(即控制是否必须插入、删除或更新它们),并在将实体附加到上下文中时设置正确的状态。

查找有关在 EF 中使用断开连接的实体的文档,例如:

这些将向您解释如何处理断开连接的实体。