Entity framework 实体框架核心:如何';擦拭并更换&x27;桥牌桌?

Entity framework 实体框架核心:如何';擦拭并更换&x27;桥牌桌?,entity-framework,.net-core,entity-framework-core,Entity Framework,.net Core,Entity Framework Core,假设我们有一个多对多关系(例如,产品和类别,其中一个产品可以在多个类别中,反之亦然)。它们通过复合键(ProductId/CategoryId)进行标识。当我们希望将更改持久化到产品聚合时,如何在Entity Framework Core中更新此桥接表 在EntityFramework6中,我只需清除桥接表中该产品的所有相关数据,然后重新填充它们。这简化了生活,因为我们不需要手动同步更改(插入、更新、删除)。只需擦拭和更换 我们如何在实体框架核心中做到这一点?以下是我尝试过的: context.

假设我们有一个多对多关系(例如,
产品
类别
,其中一个产品可以在多个类别中,反之亦然)。它们通过复合键(
ProductId
/
CategoryId
)进行标识。当我们希望将更改持久化到
产品
聚合时,如何在Entity Framework Core中更新此桥接表

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

我们如何在实体框架核心中做到这一点?以下是我尝试过的:

context.ProductCategories.RemoveRange(product.Categories);
context.ProductCategories.AddRange(updatedProductCategories);
由于复合密钥重复,这将导致异常:

InvalidOperationException:无法跟踪实体类型“ProductCategory”的实例,因为此类型的另一个实例 已跟踪具有相同密钥的类型。当添加新的 实体,对于大多数键类型,将显示唯一的临时键值 如果未设置关键点(即,如果为关键点属性指定了 其类型的默认值)。如果要显式设置键值 对于新实体,请确保它们不会与现有实体或实体冲突 为其他新实体生成的临时值。连接时 现有实体,请确保只有一个实体实例具有给定的 键值附加到上下文

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


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

您不需要同时设置product.Categories=updatedProductCategories?不是百分之百确定,因为我通常不会陷入一个我想抹掉很多男人的情况。。。您可能需要考虑原始产品中的任何一个类别,这些类型也可能在当时的上下文中加载。@ StavePy我不认为这是必要的,因为上下文应该映射相关的实体。上面的示例代码适用于具有单列键的一对多关系,但在有复合键的情况下不适用。您是否查看了新的TrackGraph API:?是否尝试查看EntityState.Distached?这样,您可以从要更新的列表中“清除”上下文跟踪器,例如:context.Entry(yourlist.State=EntityState.Distached;然后你可以执行你的AddRange