.net - Entity Framework 5 : Proper method to replace entry in context

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

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

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

我想到了 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();
    

    最佳答案

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

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

    关于.net - Entity Framework 5 : Proper method to replace entry in context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14471142/

    相关文章:

    c# - SQL Order 结果有点按字母顺序 Entity Framework/C#

    c# - WPF 元素宿主内存泄漏

    c# - 为什么 .Net 框架类中的静态方法总是线程安全的?

    database - 如何更新实体数据模型?

    c# - 使用 Entity Framework 将模型映射到现有数据库表

    c# - Entity Framework 多对多不填充集合

    c# - 从 Gmail 下载电子邮件并保存到 SQL 服务器的脚本?

    C# 为 WPF 窗口禁用 aero 捕捉

    mysql - 使用 EF 和 MySql 在生成的迁移上手动设置注释

    c# - 在运行时通过 .Net Core DI 容器更改服务是作为作用域注入(inject)还是 transient 注入(inject)?