想象一下,我们有多对多关系(例如Product
和Category
,其中一个产品可以在多个类别中,反之亦然)。它们是通过复合键(ProductId
/ CategoryId
)识别的。当我们想要将更改保留到Product
聚合时,我们如何在Entity Framework Core中更新此桥接表?
在实体框架6中,我只是在桥接表中清除该产品的所有相关数据,然后重新填充它们。这简化了生活,因为我们不需要手动同步更改(插入,更新,删除)。只需擦拭即可。
我们如何在Entity Framework Core中执行此操作?这就是我的尝试:
context.ProductCategories.RemoveRange(product.Categories);
context.ProductCategories.AddRange(updatedProductCategories);
由于重复的复合键导致异常:
InvalidOperationException:实体类型的实例' ProductCategory'无法跟踪,因为另一个实例 已经跟踪了具有相同密钥的类型。添加新内容时 实体,对于大多数密钥类型,唯一的临时密钥值将是 如果没有设置密钥,则创建(即,如果密钥属性被分配了 其类型的默认值)。如果您明确设置键值 对于新实体,确保它们不与现有实体发生冲突或 为其他新实体生成的临时值。连接时 现有实体,确保只有一个具有给定的实体实例 键值附加到上下文。
我们如何从上下文中删除复合键实体,以便我们可以添加另一个?
到目前为止,我实现这一目标的唯一方法是同步所有更改(删除,更新,插入),但擦除和替换会更简单。