IEntityChangeTracker的多个实例不能引用实体对象

时间:2012-01-02 17:50:58

标签: entity-framework entity-framework-4.1

我有一个编辑控制器操作(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的多个实例不能引用实体对象。 请建议我解决它。

1 个答案:

答案 0 :(得分:4)

以下是发生的事情:

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

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

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

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

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