Entity framework 一个实体对象不能被多个IEntityChangeTracker实例引用

Entity framework 一个实体对象不能被多个IEntityChangeTracker实例引用,entity-framework,entity-framework-4.1,Entity Framework,Entity Framework 4.1,我有一个编辑控制器操作(Httpost),代码如下: var person = membershipService.GetPersonByUserName(userName, out userAccount); if (!email.Equals(person.Email)) { person.Email = email; CRRep.UpdatePersonEmail(pe

我有一个编辑控制器操作(Httpost),代码如下:

 var person = membershipService.GetPersonByUserName(userName, out userAccount);

            if (!email.Equals(person.Email)) {
                person.Email = email;               
                CRRep.UpdatePersonEmail(person);
            }
 public void UpdatePersonEmail(Person person)
        {              
            try
            {                     
               context.Entry(person).State = System.Data.EntityState.Modified;
               context.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
                    }
                }
            }
        }
但我得到了以下错误: 一个实体对象不能被多个IEntityChangeTracker实例引用。
请给我建议解决方案。

以下是发生的情况:

在membershipService实现中,您正在查询上下文以获取person实体

然后在UpdatePersonEmail中,您将此人附加到上下文B

有几种方法可以解决这个问题。最简单的方法可能是在membershipService类中查询上下文时调用.AsNoTracking()。这样,服务返回的Person实体将不会附加到上下文:

context.People.AsNoTracking().SingleOrDefault(p => p.UserName == userName);

另一种方法是使用IoC容器注入上下文,以便UpdatePersonEmail方法的类和membershipService类具有相同的上下文实例

下面是正在发生的事情:

在membershipService实现中,您正在查询上下文以获取person实体

然后在UpdatePersonEmail中,您将此人附加到上下文B

有几种方法可以解决这个问题。最简单的方法可能是在membershipService类中查询上下文时调用.AsNoTracking()。这样,服务返回的Person实体将不会附加到上下文:

context.People.AsNoTracking().SingleOrDefault(p => p.UserName == userName);

另一种方法是使用IoC容器注入上下文,以便UpdatePersonEmail方法的类和membershipService类具有相同的上下文实例

您如何实例化和处理
上下文
?每个请求有一个上下文,每个请求有多个上下文,还是每个请求有一个上下文?我有一个上下文用于所有请求。@Slauma如果有多个上下文,我如何处理上下文。如何修改此代码?您可能在上下文生存期和多个上下文中遇到了麻烦。据我所知,该错误表明您正试图将一个实体附加到一个上下文,但它已经附加到另一个上下文(可能来自前一个请求?)。你能告诉我你是怎么做的,在哪里做的吗?处置基本上应该发生在“同一级别”=服务、控制器、应用程序或任何级别。@Slauma我在存储库的顶部创建它,如下所示:公共类UserAccountRepository{CreditRegistryContext=new CreditRegistryContext();而UpdatePersonEmail位于该存储库类的底部。如何实例化和处理
上下文
?每个请求有一个上下文,每个请求有多个上下文,还是每个请求有一个上下文?所有请求都有一个上下文。@Slauma如果有多个上下文,我如何处理上下文。如何修改此代码?你知道吗可能上下文生存期和多个上下文比较混乱。据我所知,错误表明您正试图将一个实体附加到一个上下文,但它已经附加到另一个上下文(可能来自前一个请求?)。您能说明如何以及在何处执行“新上下文…”处理基本上应该发生“在同一级别”=服务、控制器、应用程序或任何级别。@Slauma我在存储库的顶部创建它,如下所示:公共类UserAccountRepository{CreditRegistryContext=new CreditRegistryContext();UpdatePersonEmail位于存储库类的底部