2015-12-10 2 views
-1

Я попробовал несколько найденное решение в стеке и в Интернете я потерял целый день работы за это, пожалуйста, взгляните на мой кодОшибка «Объект сущности не может ссылаться на несколько экземпляров IEntityChangeTracker». : как правильно обновлять дочерние объекты?

public async Task<ActionResult> Edit(JobeezUserInfoViewModel jobeezUserInfo, HttpPostedFileBase UploadedImage) 
    { 
var user = UserManager.FindById(User.Identity.GetUserId()); 
     //list of languages 
     var lgs = jobeezUserInfo.Languages.Select(l => l.LanguageId); 

//Languages to be deleted 
     var lngTodel = db.Languages.AsNoTracking() 
      .Where(ut => ut.JobeezUserInfoId == jobeezUserInfo.ApplicationUserId) 
      .Where(ut => !lgs.Contains(ut.LanguageId)); 
//language ids as Ilist for better performace 
var ids = lgs as IList<int> ?? lgs.ToList(); 
//Languages to be added 
     var lngToAdd = ids 
      .Where(
       lid => 
        user.JobeezUserInfo.Languages 
         .Select(ut => ut.LanguageId) //for each userlanguages create a list if languageids _ 
         .Contains(lid) == false //_check if it does not contain the posted languageids and return the language ids if it is the case(tid is the posted languageid) 
      ) 
      .Select(tid => 

       new Language() 
       { 

        JobeezUserInfoId = user.Id, 
        LanguageId = tid, 
        Name = Enum.GetName(typeof(Enums.LanguageEnum), tid) 
       }); 
//languages to be updated 
     var lngToUpdate = user.JobeezUserInfo.Languages.Where(l=>ids.Contains(l.LanguageId)); 


     Mapper.CreateMap<JobeezUserInfoViewModel, JobeezUserInfo>(MemberList.Destination); 
     JobeezUserInfo info = Mapper.Map<JobeezUserInfo>(jobeezUserInfo) as JobeezUserInfo; 

     user.FirstName = jobeezUserInfo.FirstName; 
     user.LastName = jobeezUserInfo.LastName; 
     user.PostCode = jobeezUserInfo.PostCode; 
     user.PhoneNumber = jobeezUserInfo.Telephone; 

     if (ModelState.IsValid) 
     { 
      //mark modified for the userinfo 
      db.JobeezUserInfo.Attach(info); // Entity is in Unchanged state 
      db.Entry(info).State = EntityState.Modified; 

, а следующая строка это - Мой вопрос, почему я не могу прикрепить объект языка «л»

lngToUpdate.ForEach(l => 
     { 
      db.Languages.Attach(l); 
      db.Entry(l).State = EntityState.Modified; 

     }); 

у меня есть ошибка

«объект лицо не может ссылаться несколько экземпляров IEntityCha ngeTracker «.

Я открыл быстрый взгляд После следующая строка (одна часть изображения показывает также входные параметры моего Controler действия (ViewModel объекта):

  //mark modified for the userinfo 
      db.JobeezUserInfo.Attach(info); // Entity is in Unchanged state 

enter image description here

Precision : языковой объект в db.changetracket.Entities() - это тот же объект, который отправлен на мой сервер (в моей модели viewModel), почему инфраструктура enitity не может понять, что новый объект должен быть отслежен или привязан вместо нового языкового объекта (Мой код является частичным для клана rity я могу опубликовать полный код, если необходимо) Мой вопрос: я действительно не знаю, что является лучшим методом для правильного обновления дочерних объектов. Что я делаю неправильно здесь и как получить эту работу? заранее спасибо

+0

Вам, вероятно, придется отличать 'lngToUpdate'. –

+0

действительно не здорово, что он никуда не объяснил, даже не объяснив, что это похоже на то, что мы могли бы квалифицировать во Франции как «c'est rat, mais et merci de votre gentillesse!». @GertArnold список отличается. независимо от того, что он сбой при первой итерации! проблема в том, что список языков не может быть прикреплен, потому что theEF отслеживает список языков, найденный в моем представлении. Спасибо, спасибо! Я не знаю, как я могу заменить этот отслеживаемый объект моим новым списком.? иногда EF действительно сложно с некоторыми из его утилит. –

ответ

0

я понял, что у меня есть две различных ошибок на самом деле

1.

Я имел эту ошибку, потому что lngToUpdate был ошибочно заселен один - говорить о следующей строке (моем Плохо! ;)).

var lngToUpdate = user.JobeezUserInfo.Languages.Where(l=>ids.Contains(l.LanguageId)); 

Это тот же набор, что и в базе данных, который, очевидно, уже отслеживался. , поэтому я создал новую коллекцию с измененными значениями свойств для каждого языка, свойства которого должны были быть обновлены.

2.

Теперь для двух других списков lngToAdd и lngToUpdate, с ObjectStateManager получил купить следующий код

var manager = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager; 

Я использовал менеджер, чтобы изменить objectState из peviously отслеживаемые языки как EntityState.unchanged, добавили новые в контекст и обозначили EntityState.Added EntityState.Deleted соответственно (согласно моим спискам).

и это сработало! надеюсь, это поможет кому-то!

1

Я решил проблему родительского ребенка, используя AsNoTracking().

Здесь BOND - мой родительский стол, а GOVBONDINTERESTSCHEDULE - его ребенок. Также FI - еще одна детская таблица BOND. Простое обновление. Из-за отслеживания EF возникла ошибка. Поэтому я просто обновил GOVBONDINTERESTSCHEDULE, используя AsNoTracking().

Ниже мой рабочий код.

GOVBONDINTERESTSCHEDULE editmodel = new GOVBONDINTERESTSCHEDULE(); 
editmodel = new Entities(Session["Connection"] as EntityConnection). 
    GOVBONDINTERESTSCHEDULEs.Include("BOND").AsNoTracking().Where(t => t.REFERENCE == Ref). 
    SingleOrDefault(); 
editmodel.STATUS = ConstantVariable.STATUS_APPROVED; 
editmodel.LASTUPDATED = DateTime.Now; 
editmodel.LASTUPDATEDBY = Session["UserId"].ToString(); 
using (Entities db = new Entities(Session["Connection"] as EntityConnection)) { 
    db.Entry(editmodel).State = EntityState.Modified; 
    db.SaveChanges(); 
} 
+0

Я думаю, что я пробовал это раньше. но да, это может помочь кому-то –

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