【发布时间】:2016-09-17 23:29:02
【问题描述】:
我正在尝试对某些实体进行深度克隆。 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
但是当我运行它时,我得到:
ObjectStateManager 中已存在具有相同键的对象。现有对象处于已修改状态。只有处于添加状态的对象才能再次添加到 ObjectStateManager 中。
当我修改 Grade.Name 时,它的 EntityState 更改为 modified 暗示它正在被跟踪。
我正在使用 EF5 Db-First。
或者,我尝试通过分离等级然后重新插入来进行克隆,这可行,但等级宽度不会被复制。一旦我调用 detach,gradewidth 计数就会从 2 变为 0。
问题:
- 知道为什么 AsNoTracking 不起作用,我可以做些什么来解决这个问题?
- 另外,还有其他人可以推荐用于简单深度克隆的方法吗?
谢谢。
---- 附加信息----
我有 5 个一对多的关系,最终我想从顶层一直克隆下去。但我将其简化为只查看最低级别。
- 1 级到多个 GradeWidths
【问题讨论】:
-
您想将实体附加到上下文,而不是添加它。无论如何,添加只会在表中创建一个新行。
-
@DavidG - 我正在尝试创建一个新行(即复制它)。此外,尽管我调用了 AsNoTracking,但我无法调用 attach,因为实体已经附加了
-
啊,我应该读一下!那么你可能只需要对主键值进行闪电战。
-
仍然打开。有人有什么想法吗?
-
您是否尝试在添加主键之前将其设为空?或者如果是 int 则设为 0。
标签: vb.net entity-framework entity-framework-5