2015-12-10 43 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; 

下一行是這樣的 - 我的問題是,爲什麼我不能附加語言對象「L」

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

     }); 

我有錯誤

「的實體對象不能被 IEntityCha的多個實例引用ngeTracker「。

我已打開的快速查看後,將下面的行(圖像的一部分也示出了我的CONTROLER動作的輸入參數(視圖模型對象):

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

enter image description here

精密:db.changetracket.Entities()中的languageobject是發佈到我的服務器(在我的viewModel中)的同一個對象,爲什麼enitity框架無法理解新對象必須被跟蹤或附加以代替新的語言對象(我的代碼是cla部分的rity我可以張貼完整的代碼,如果需要的話) 我的問題是:我真的不知道什麼是正確更新子實體的最佳方法。我在這裏做錯了什麼,以及如何獲得這項工作? 由於事先

+0

您可能必須使'lngToUpdate'不同。 –

+0

如果沒有解釋任何事情,我們可能在法國取得合格的資格就會降級,這真的不是一件好事 - 「c'est rat,mais et merci de votre gentillesse!」 @GertArnold的名單是不同的。無論它在第一次迭代本身崩潰!問題是,不能附加語言列表,因爲EF正在跟蹤我的viewModel中找到的語言列表,謝謝!我不知道我可以用我的新名單替換這個跟蹤的對象..?有時候EF真的很難處理它的一些缺陷。 –

回答

0

我明白,我有兩個不同的錯誤實際上

1.

我有這個錯誤,因爲lngToUpdate被錯誤地填充一個 - 談到以下行(我不好!;))。

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

它與數據庫中顯然已被跟蹤的集合相同。 所以我創建了一個新的集合,其屬性將被更新的每種語言的修改屬性值。

2.

現在對於其他兩個列表lngToAddlngToUpdate,與ObjectStateManager得到買

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

我使用管理器來改變的peviously的objectState下面的代碼跟蹤語言爲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

我認爲我曾嘗試過。但是,它可以幫助某人 –

相關問題