Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# &引用;一个实体对象不能被IEntityChangeTracker的多个实例引用。”;_C#_Entity Framework - Fatal编程技术网

C# &引用;一个实体对象不能被IEntityChangeTracker的多个实例引用。”;

C# &引用;一个实体对象不能被IEntityChangeTracker的多个实例引用。”;,c#,entity-framework,C#,Entity Framework,我使用MYSql服务器作为windows窗体应用程序后面的数据库。在我的数据库中有两个模式,我必须将条目放入其中。我已经为每个模式创建了两个上下文对象。当我使用schema1上的contextA时,所有条目都完成得很完美,但是当我使用contextB时,我得到了这个异常。 它是否与MySql驱动程序有关。几乎可以肯定,这是由代理和更改跟踪引起的。在这两个构造函数中禁用这些功能,看看它是否解决了您的问题 public class contextA : DbContext { public c

我使用MYSql服务器作为windows窗体应用程序后面的数据库。在我的数据库中有两个模式,我必须将条目放入其中。我已经为每个模式创建了两个上下文对象。当我使用schema1上的contextA时,所有条目都完成得很完美,但是当我使用contextB时,我得到了这个异常。
它是否与MySql驱动程序有关。

几乎可以肯定,这是由代理和更改跟踪引起的。在这两个构造函数中禁用这些功能,看看它是否解决了您的问题

public class contextA : DbContext
{
   public contextA()
   {
      Configuration.ProxyCreationEnabled = false;
   }
}

此错误表示您正试图将一个实体附加到您的上下文,但它已附加到另一个实体

我的怀疑是,这可能不是一个直接引用,但您上下文中的一个导航属性可能包含一个附加到另一个上下文的实体。在我看来(根据您所描述的),只有当它们是断开连接的对象结构时,才应该真正使用单独的上下文,例如它们在上下文之间没有FK

另一件要避免的事情是确保每个工作单元只使用每个上下文的一个实例。如果尝试使用另一个上下文实例中的实体,也会发生此错误

编辑:

如果您想在当前上下文之外维护范围,通常最好使用ID。您可以将实体重新附加到EF,以便以描述的方式添加它们,但必须确保原始上下文已释放或实体已分离,然后手动将其附加到新上下文,如下所示:

    public DbEntityEntry<T> EnsureAttachedEF(T entity)
    {
        var e = m_Context.Entry(entity);
        if (e.State == EntityState.Detached)
        {
            m_Context.Set<T>().Attach(entity);
            e = m_Context.Entry(entity);
        }

        return e;
    }
public DbEntityEntry确保重新连接def(T实体)
{
var e=m_上下文条目(实体);
if(e.State==EntityState.Detached)
{
m_Context.Set().Attach(实体);
e=m_上下文。条目(实体);
}
返回e;
}

然而,这是一项相当多的工作,因此使用IDs通常是一个更好的主意。

将注释移动到anwser:

似乎您可能在EF上下文之外使用实体。这将导致无法跟踪对实体的更改。同时,EF将缓存该实体,如果您尝试将该实体附加到上下文,它将看到该实体已经存在,并将抛出一个错误


您可以使用EF中的
NoTracking
选项,如果您在上下文之外使用实体,则可以阻止EF缓存实体。

您是同时使用这两个上下文,还是
使用另一个之前处理
第一个上下文?您是否有一些代码可用于此操作?它可以是一件简单的事情,比如你在EF之外获取实体并使用它,然后尝试将其连接回来,但是EF已经缓存了一个副本。@Justin我想这就是我在EF之外存储用户实体的问题,以便维护会话,然后使用第二个上下文而不是使用其用户ID创建新条目。我使用的是整个用户对象。我修复了它,如果它能工作,那又怎么样?您是否建议他完全禁用更改跟踪以“修复”问题?在我看来,这根本没有解决办法,也没有真正指出真正的问题。@jesus.tesh我同意你的观点。我所做的就是找出问题的原因。您不需要代理来跟踪更改,但是如果您依赖于它们,那么您必须接受您不能将同一个对象实例添加到2个上下文中。就我个人而言,我不使用代理对象。+1-如果没有更多信息,我猜是第二部分-可能有2个上下文。我在尝试缓存实体时也遇到过类似的问题。