我在我的Windows窗体应用程序后面使用MYSql服务器作为数据库。我的数据库中有两个模式,我必须将条目放入。我为每个模式创建了两个上下文对象。当我使用schema1上的contextA时,所有条目都完美地完成,但是当我使用contextB时,我得到了这个异常。 它与MySql Driver有关。
答案 0 :(得分:9)
此错误表示您正在尝试将实体附加到您的上下文,但它已附加到另一个实体。
我怀疑这可能不是直接引用,但是您的上下文中的某个导航属性可能包含附加到其他上下文的实体。在我看来(根据你所描述的)单独的上下文应该只在它们是断开连接的对象结构时才被使用,例如它们在上下文之间没有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通常是一个更好的主意。
答案 1 :(得分:4)
几乎可以肯定是由代理和变更跟踪引起的。在两个构造函数中禁用这些功能,看看它是否可以解决您的问题。
public class contextA : DbContext
{
public contextA()
{
Configuration.ProxyCreationEnabled = false;
}
}
答案 2 :(得分:2)
将评论移至anwser:
看起来你可能正在使用EF上下文之外的实体。这将导致不跟踪实体的更改。同时,EF将缓存此实体,如果您尝试将实体附加到上下文,它将看到它已存在并将引发错误。
如果您在上下文之外使用它,可以使用EF中的NoTracking
选项来阻止EF缓存实体。