vb.net - 将 AsNoTracking 与 EntityFramework 一起使用的问题

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

我正在尝试对某些实体进行深度克隆。 this article中提到的方法看起来不错,但我遇到了错误。它建议使用 AsNoTracking() 来检索实体,然后将其重新插入上下文中,因为它看起来像一个新对象,因此会导致插入。

这是我的代码:

        Using ctxt As New ProductionDataEntities
            Dim grade = ctxt.Grades.Include(Function(g) g.GradeWidths).AsNoTracking.First
            ctxt.Grades.AddObject(grade)
            ctxt.SaveChanges()
        End Using

但是当我运行它时,我得到:

An object with the same key already exists in the ObjectStateManager. The existing object is in the Modified state. An object can only be added to the ObjectStateManager again if it is in the added state.



当我修改 grade.Name 时,它​​的 EntityState 更改为已修改,这意味着它正在被跟踪。

我正在使用 EF5 Db-First。

或者,我尝试通过分离等级然后重新插入它来克隆,这有效,但 GradeWidths 不会被复制。一旦我调用 detach,gradewidth 计数就会从 2 变为 0。

问题:
  • 知道为什么 AsNoTracking 不起作用以及我可以做些什么来解决这个问题吗?
  • 或者,有人可以推荐另一种方法进行简单的深度克隆吗?

  • 谢谢。

    - - 附加信息 - -

    我有 5 个一对多的关系,最终我想从顶层一直向下克隆。但我将其简化为仅查看最低级别。
  • 1 个等级到多个等级宽度
  • 最佳答案

    使用 ObjectContext

    使用 ObjectContext您可以先附加父对象,然后将对象状态更改为已添加。同样对于每个子对象,将对象状态更改为已添加。你甚至不需要AsNoTracking() .

    例如对于 Category(1)↔(N)Product我用这个代码的关系:

    Using db As New SampleSystemEntities
        Dim c = db.Categories.Include(Function(x) x.Products).First
        db.Attach(c)
        db.ObjectStateManager.ChangeObjectState(c, EntityState.Added)
        For Each p As Product In c.Products
            db.ObjectStateManager.ChangeObjectState(p, EntityState.Added)
        Next
        db.SaveChanges()
    End Using
    

    使用 DbContext

    如果您使用 DbContext使用您的代码,一切都会正常工作:
    Using db As New SampleSystemEntities
        Dim c = db.Categories.Include(Function(x) x.Products).AsNoTracking().First
        db.Categories.Add(c)
        db.SaveChanges()
    End Using
    

    关于vb.net - 将 AsNoTracking 与 EntityFramework 一起使用的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39332664/

    相关文章:

    vb.net - *微妙* VB函数和Convert.To *函数之间的区别?

    c# - 如何在 C# 中通过表达式构建动态查询

    c# - 我在 Entity 框架中找不到带有 lambda 表达式的 "Include"方法?

    c# - 如何在使用 DbContext 保存对象后获取对象的主键

    .net - Entity Framework 数据上下文中没有带有连接字符串的构造函数

    vb.net - 删除单个 .txt 文件(如果 Visual Basic 中存在)?

    asp.net - 从 ASP.net 页面上的集合输出数据的最佳实践是什么?

    javascript - 从 vb.net 中的代码隐藏调用 javascript 代码

    entity-framework - EF Codefirst 和 RDLC 报告

    c# - DB ConnectionState = Open 但 context.SaveChanges 抛出 "connection broken"异常