c# - "An entity object cannot be referenced by multiple instances of IEntityChangeTracker."

标签 c# entity-framework

我正在使用 MYSql 服务器作为我的 Windows 窗体应用程序背后的数据库。我的数据库中有两个模式,我必须将条目放入其中。我为每个模式创建了两个上下文对象。当我使用 schema1 上的 contextA 时,所有条目都完美完成,但是当我使用 contextB 时,我得到了这个异常。 是不是跟MySql Driver有关系。

最佳答案

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

我怀疑这可能不是直接引用,而是上下文中的导航属性之一可能包含附加到其他上下文的实体。在我看来(从你所描述的)单独的上下文只有在它们是断开连接的对象结构时才真正使用,例如它们在上下文之间没有 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;
    }

但这需要大量工作,因此通常使用 ID 是更好的主意。

关于c# - "An entity object cannot be referenced by multiple instances of IEntityChangeTracker.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16934376/

相关文章:

c# - 鼠标自动化和与 Flash 应用程序交互时出现问题

c# - 即使定义了其他主键, Entity Framework 6 也会创建 Id 列

vb.net - c# linq 到 vb 的翻译 - 使用 'selectmany' 语句在智能感知中重载解析失败

c# - 检查 Linq to Entity 中的 True 或 Null 值

c# - 使用children更新数据库条目

c# - Linq 检查列表是否在另一个列表中

c# - 为什么在 C# 中我们需要初始化原始类型变量?

c# - 是否可以将包含 List<String> 的 List<Object> 绑定(bind)到 DataGrid

c# - 扩展 Entity Framework 的工作单元

c# - 将 C#/.NET 中的位图序列化为 XML