gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:51:50 28 4
gpt4 key购买 nike

我正在尝试对某些实体进行深度克隆。 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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com