C# 实体框架代码优先:如何附加实体和修改集合类型属性?

C# 实体框架代码优先:如何附加实体和修改集合类型属性?,c#,entity-framework,C#,Entity Framework,我有一个实体“A”,它具有ICollection导航属性,该属性包含实体“B”的集合 假设数据库包含对象“A1”,它的集合属性包含3个实体:“B1、B2、B3” 现在我在代码中有分离的实体“A1”,它的集合属性包含分离的实体“B3,B4” 是否可以将对象“A1”附加到上下文并标记集合属性也应更新?(应删除实体B1、B2,添加实体B4) 我尝试了以下操作,但没有更新导航属性(集合)(仅更新标量属性): 您应该使用Attach,它将递归地附加您的对象 context.As.Attach(A1);

我有一个实体“A”,它具有ICollection导航属性,该属性包含实体“B”的集合

假设数据库包含对象“A1”,它的集合属性包含3个实体:“B1、B2、B3”

现在我在代码中有分离的实体“A1”,它的集合属性包含分离的实体“B3,B4”

是否可以将对象“A1”附加到上下文并标记集合属性也应更新?(应删除实体B1、B2,添加实体B4)

我尝试了以下操作,但没有更新导航属性(集合)(仅更新标量属性):


您应该使用Attach,它将递归地附加您的对象

context.As.Attach(A1);
其中As是上下文公开的DbSet

context.Set<TA>().Attach(A1);
context.Set().Attach(A1);

也可以,TA类型为A1。

可能重复我使用的附加方法。它适用于附加实体和“一对多”相关实体。在我的例子中,“A”和“B”之间的关系是“多对多”(两个实体都有彼此的集合)。在这种情况下,EF似乎忽略了“多对多”关系。
            using (var ctx = GetContext())
            {
                int[] ids = ctx.Bs.Select(x => x.Id).ToArray();
                foreach (Bs b in A1.BsCollection)
                {
                    if (!ids.Contains(b.Id))
                        ctx.Bs.Add(b);
                    else if(...){ ... }
                }
                ctx.As.Attach(A1);
                ctx.Entry(A1).State = EntityState.Modified;
                ctx.SaveChanges();
            }
            using (var ctx = GetContext())
            {
                int[] ids = ctx.Bs.Select(x => x.Id).ToArray();
                foreach (Bs b in A1.BsCollection)
                {
                    if (!ids.Contains(b.Id))
                        ctx.Bs.Add(b);
                    else if(...){ ... }
                }
                ctx.As.Attach(A1);
                ctx.Entry(A1).State = EntityState.Modified;
                ctx.SaveChanges();
            }