【问题标题】:Entity Framework Code-First: How to attach an entity and modify collection type property?实体框架代码优先:如何附加实体并修改集合类型属性?
【发布时间】:2014-07-11 20:53:08
【问题描述】:

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

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

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

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

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

context.Entry(A1).State = EntityState.Modified;

【问题讨论】:

标签: c# entity-framework


【解决方案1】:

你应该使用 Attach 来递归地附加你的对象

context.As.Attach(A1);

其中 As 是由上下文公开的 DbSet。

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

也可以,TA 是 A1 的类型。

【讨论】:

  • 我使用 Attach 方法。它适用于“一对多”关系中的附加实体和相关实体。就我而言,“A”和“B”之间的关系是“多对多”(两个实体都有彼此的集合)。似乎在这种情况下,EF 只是忽略了“多对多”关系。
【解决方案2】:
            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();
            }

【讨论】:

    猜你喜欢
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多