ObjectStateManager中已存在具有相同键的对象.现有对象处于Unchanged状态

Dra*_*cir 3 .net entity-framework

我试图将foo类型的实体列表插入表TB_FOO.

    Public Sub Insert(ByVal _lstFoo As List(Of TB_FOO))

    Try
      For i As Integer = 0 To _lstFoo.Count - 1
        Dim foo As TB_FOO = _lstFoo(i)        
        _MyEntityManager.AddToTB_FOO(foo)
      Next
      _MyEntityManager.SaveChanges()
      _MyEntityManager.AcceptAllChanges()
    Catch ex As Exception
      Debug.WriteLine(ex.StackTrace)
    End Try

  End Sub
Run Code Online (Sandbox Code Playgroud)

在foo对象中有2个关系.一个是实体TB_FOO2,它是刚刚在代码中插入的对象,另一个是从数据库中选择的TB_FOO3.

在循环的第一次迭代到达_MyEntityManager.AddToTB_FOO(foo)它时抛出错误

ObjectStateManager中已存在具有相同键的对象.现有对象处于Unchanged状态.如果对象处于添加状态,则只能再次将其添加到ObjectStateManager.

任何想法为什么抛出这个错误?

Cra*_*ntz 8

你可能正在重新使用旧的ObjectContext.

这一行:

_MyEntityManager.AddToTB_FOO(foo)
Run Code Online (Sandbox Code Playgroud)

...如果已经存在与foo上下文中具有相同主键值的实体,则将失败.如果foo通过导航属性与某个其他已分离的实体相关联,但在上下文中具有相同主键值的"双胞胎"实体,它也将失败.

没有这些问题的最简单方法是ObjectContext为整个方法使用一个新实例,并在完成后处理它.长寿ObjectContexts几乎总是会导致内存泄漏并且真正令人困惑的错误.