【问题标题】:Entity Framework 5 : Proper method to replace entry in context实体框架 5:在上下文中替换条目的正确方法
【发布时间】:2013-01-23 01:40:18
【问题描述】:

我想做的很简单。 我在数据库中有一个零件列表,我想根据更新列表删除/插入/更新它们。

主要问题是,当我想替换一个条目时,我无法将它附加到上下文中,因为旧的(要更新的)条目已经附加(通过先前的读取调用)并且引发​​了异常。

我想到了 3 个想法。

  1. 手动分离旧条目并附加新条目(尽管将实体状态更改为已分离仍会引发异常)
  2. 用新条目手动更改旧条目的值
  3. 使读取调用无法跟踪 (AsNoTracking()),这似乎工作正常,但我担心对延迟加载的影响。

是否有像“context.entry.replace(oldEntry,newEntry)”这样的功能或任何其他适当的方法来做到这一点?

IEnumerable<SoldPart> old = db.SoldParts.Where(sp=>sp.sessionId == sessionId);

                var toDelete = old.Where(po=> !parts.Any(pu=>pu.id == po.id));
                var toCreate = parts.Where(po => !old.Any(pu => pu.id == po.id));
                var toUpdate = parts.Where(po => old.Any(pu => pu.id == po.id));


                foreach (SoldPart item in toDelete)
                {
                    db.SoldParts.Attach(item);
                    db.SoldParts.Remove(item);
                }
                foreach (SoldPart item in toCreate)
                {
                    db.SoldParts.Add(item);
                }

                foreach (SoldPart item in toUpdate)
                {

                    db.SoldParts.Attach(item);
                    db.Entry(item).State = EntityState.Modified;
                }


                db.SaveChanges();

【问题讨论】:

  • 如果您的上下文已经在跟踪您想要删除/插入/更新的实体,为什么不直接对它们执行操作?

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


【解决方案1】:

有一种自动方法可以从分离的实体中更新附加实体的值,但它仅适用于标量/复杂属性。不在导航属性上:

deb.Entry(oldEntry).CurrentValues.SetValues(newEntry);

【讨论】:

  • @drunkcamel:你能解释一下吗?实体必须有PK,否则不是实体。
  • 对不起,我试过了,但遇到异常,a 属性是实体键的一部分,无法分配。但现在我试图重现它,但我不能。
  • @drunkcamel:很可能是因为oldEntrynewEntry 的实体键值不同。它可能会失败,因为您无法更改现有实体的键。
猜你喜欢
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多