2012-01-02 75 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類。

相關問題