“IEntityChangeTracker的多个实例无法引用实体对象。”

我使用MYSql服务器作为我的Windows窗体应用程序后面的数据库。 我的数据库中有两个模式,我必须将条目输入。 我为每个模式创建了两个上下文对象。 当我使用schema1上的contextA时,所有条目都完美地完成,但是当我使用contextB时,我得到了这个exception。 它与MySql Driver有关吗?

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

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

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

编辑:

如果要将范围保持在当前上下文之外,则通常使用ID更好。 您可以将实体重新附加到EF,以便您可以按照描述的方式添加实体,但必须确保处理原始上下文或分离实体,然后使用以下内容手动将其附加到新上下文:

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

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

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

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

将评论移至anwser:

看起来你可能正在使用EF上下文之外的实体。 这将导致不跟踪实体的更改。 同时,EF将缓存此实体,如果您尝试将实体附加到上下文,它将看到它已存在并将引发错误。

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