实体框架5:在上下文中替换条目的正确方法

时间:2013-01-23 01:40:18

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

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

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

我带着3个想法来到这里。

  1. 手动分离旧条目并附加新条目(尽管将实体状态更改为分离仍会引发异常)
  2. 使用新的
  3. 手动更改旧条目的值
  4. 使读取调用无法跟踪(AsNoTracking()),这似乎工作正常,但我担心对延迟加载的影响。
  5. 是否有任何功能,如“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();
    

1 个答案:

答案 0 :(得分:33)

可以自动更新附加实体的值,但它仅适用于标量/复杂属性。不在导航属性上:

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