实体框架核心:如何擦除和替换'桥牌桌?

时间:2017-06-13 06:35:07

标签: entity-framework .net-core entity-framework-core

想象一下,我们有多对多关系(例如ProductCategory,其中一个产品可以在多个类别中,反之亦然)。它们是通过复合键(ProductId / CategoryId)识别的。当我们想要将更改保留到Product聚合时,我们如何在Entity Framework Core中更新此桥接表?

在实体框架6中,我只是在桥接表中清除该产品的所有相关数据,然后重新填充它们。这简化了生活,因为我们不需要手动同步更改(插入,更新,删除)。只需擦拭即可。

我们如何在Entity Framework Core中执行此操作?这就是我的尝试:

context.ProductCategories.RemoveRange(product.Categories);
context.ProductCategories.AddRange(updatedProductCategories);

由于重复的复合键导致异常:

  

InvalidOperationException:实体类型的实例' ProductCategory'无法跟踪,因为另一个实例   已经跟踪了具有相同密钥的类型。添加新内容时   实体,对于大多数密钥类型,唯一的临时密钥值将是   如果没有设置密钥,则创建(即,如果密钥属性被分配了   其类型的默认值)。如果您明确设置键值   对于新实体,确保它们不与现有实体发生冲突或   为其他新实体生成的临时值。连接时   现有实体,确保只有一个具有给定的实体实例   键值附加到上下文。

我们如何从上下文中删除复合键实体,以便我们可以添加另一个?

到目前为止,我实现这一目标的唯一方法是同步所有更改(删除,更新,插入),但擦除和替换会更简单。

0 个答案:

没有答案