2014-07-23 14 views
-1

我真的希望有人能幫助我。從EditViewModelEF不保存更改

public ActionResult Edit(EditViewModel vm) 
    { 
     Item item= db.Items.Find(vm.ItemId); 
     if (ModelState.IsValid) 
     { 
      //breakpoint 1 --> everything works fine, if its debugged step by step from here 

      //if item´s contact is null or different from viewmodel --> override it 
      if (item.Contact == null || item.Contact.ContactId != vm.ContactId) 
       item.Contact = db.Contacts.Find(vm.ContactId); 

      //if the viewmodel have a ContractUnit set and its different from item´s --> override the contractunit 
      //is the ContractUnit in viewmodel null set item´s null too 
      if (vm.ContractUnitId.HasValue && ((item.ContractUnit != null && item.ContractUnit.ContractUnitId != vm.ContractUnitId) || item.ContractUnit == null)) 
       item.ContractUnit = db.ContractUnits.Find(vm.ContractUnitId); 
      else 
       if (!vm.ContractUnitId.HasValue) 
        item.ContractUnit = null; 

      //same as above just for Building 
      if (vm.BuildingId.HasValue && ((item.Building != null && item.Building.BuildingId != vm.BuildingId) || item.Building == null)) 
       item.Building = db.Buildings.Find(vm.BuildingId); 
      else 
       if (!vm.BuildingId.HasValue) 
        item.Building = null; 

      //same as above just for EconomicUnit 
      if (vm.EconomicUnitId.HasValue && ((item.EconomicUnit != null && item.EconomicUnit.EconomicUnitId != vm.EconomicUnitId) || item.EconomicUnit == null)) 
       item.EconomicUnit = db.EconomicUnits.Find(vm.EconomicUnitId); 
      else 
       if (!vm.EconomicUnitId.HasValue) 
        item.EconomicUnit = null; 

      //breakpoint 2 --> (no changes to item, if its the first breakpoint) 
      item= vm.GetItem(item); //override non relational data 
      db.Entry(item).State = EntityState.Modified; 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
... 
    } 

方法的GetItem:我有以下控制器動作

public Item GetItem(Item item) 
    { 
     item.DateReported = this.DateReported; //Datetime 
     item.Description = this.Description; //String 
     item.FirstDeadline = this.FirstDeadline; //Datetime 
     item.SecondDeadline = this.SecondDeadline; //Datetime 
     item.ThirdDeadline = this.ThirdDeadline; //Datetime 
     item.ReplacementDeadline = this.ReplacementDeadline; //Datetime 
     return item; 
    } 

問題:EF不保存更改item.Building,item.ContractUnit或item.EconomicUnit。但是,當我逐步調試它時,它確實如此。 沒有錯誤或異常拋出,視圖模型和模型正確填充。

我真的希望有人能幫助我解決這個...

+0

通過將代碼縮減爲演示問題所需的最小代碼,您可能會更好地找到自己或幫助您的人的答案。理想的是創建一個全新的解決方案。也發佈連接字符串,你的EF初始化代碼等。 – demoncodemonkey

+0

其實我已經減少了代碼對一切影響這種行爲。其他一切工作正常,以及連接字符串。我的問題是,除非我正在逐步調試,否則ef不會反映數據庫的更改。 – b1ub

+0

GetItem有什麼作用?代碼如何查找? –

回答

0

我刪除從項目模型之間的關係,現在只保存在IDS「長?」屬性。那麼,它現在額外的工作來獲得相關數據,但至少它的工作。

0

嘗試調用

db.Entry(item).State = EntityState.Modified; 

也許這有助於

DBSet.Attach(entityToUpdate); 

之前。