2012-01-02 2 views
0

У меня есть действие Edit контроллера (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

Как вы создаете экземпляр и устанавливаете контекст? У вас есть один контекст для каждого запроса, несколько контекстов для каждого запроса или один контекст для нескольких запросов? – Slauma

+0

У меня есть один контекст для всех запросов. –

+0

@Slauma Как я могу избавиться от контекста Если у меня есть кратные. Как изменить этот код? –

ответ

4

Вот что происходит:

В вашей реализации membershipService, вы запрашиваете контекст, чтобы получить лицо субъекта.

Тогда в UpdatePersonEmail вы прикрепление человека к контексту B.

Есть несколько способов решить эту проблему. Простейший, вероятно, вызывает .AsNoTracking(), когда вы запрашиваете контекст A в классе membershipService. Таким образом, лицо объект, возвращаемый служба не будет приложен к контексту:

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

Другим способом придать контекст, используя контейнер IoC, так что класс как от метода UpdatePersonEmail имеет тот же экземпляр контекста как класс membershipService.

Смежные вопросы