如何在 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 中使用断开连接的实体的文档,例如:
这些将向您解释如何处理断开连接的实体。
我正在使用 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 中使用断开连接的实体的文档,例如:
这些将向您解释如何处理断开连接的实体。