2012-01-02 77 views
0

的多个实例可以参考我有一个编辑控制器动作(Httpost)与下面的代码:一个实体对象不能被IEntityChangeTracker

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

你如何实例化和处理'context'?每个请求是否有一个上下文,每个请求有多个上下文或每个请求有多少个上下文? – Slauma 2012-01-02 18:03:41

+0

我对所有请求都有一个上下文。 – 2012-01-02 18:10:19

+0

@Slauma如何处理上下文如果我有倍数。如何修改此代码? – 2012-01-02 18:16:23

回答

4

这里是正在发生的事情:

在你membershipService实现,您要查询上下文中的获得的人实体。

然后在UpdatePersonEmail要连接的人B.背景

有解决这几个方面。最简单的方法可能是在membershipService类中查询上下文A时调用.AsNoTracking()。通过这种方式,由服务返回的Person实体将不会附加上下文答:

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

另一种方法是注射使用IoC容器的背景下,这样既UpdatePersonEmail方法的类具有相同的上下文实例作为membershipService类。

相关问题