2016-08-15 99 views
0

這真的很奇怪。我想要一個簡單的事情,我試圖找到一個實體,改變實體的域,然後提交更改到數據庫:實體框架不會對數據庫提交更改

using (AppDbContext context = new AppDbContext()) { 
    try { 
     var member = context.Members.SingleOrDefault(m = m.MembershipNumberId == membershipNo); 
     var centre = context.Centres.SingleOrDefault(c => c.CentreId == oldCentreId); 

     if (member != null) { 
      if (centre != null) { 
       member.Centre_id = Centre.id; 
       context.SaveChanges(); 
      }      
     } 
    } catch (Exception e) { 
     HandleError(e); 
    } 
} 

所以非常直截了當的東西。但是,由於某些原因沒有對數據庫進行任何更改,實際上,EntityState仍然是Modified

在我看來,事情變得非常奇怪:我在AppDbContext.SaveChanges()中放置了一個斷點,以便在調試時查看changetracker。

當我這樣做,一切都看起來不錯,我看到我的Centre實體在Unchanged狀態,我看到Modified狀態我Member實體。當我打開位於監視窗口中ChangeTracker的Member實體時,出於某種原因,這使得代碼在恢復時可以正常工作,並且相應地更新了數據庫。

長話短說:SaveChanges不會對數據庫提交更改。但是,如果我在保存更改時放置斷點,請查看監視窗口中的更改跟蹤器,然後打開修改後的實體(在我的示例中爲Member),然後恢復,它可以工作!

那麼當您在監視窗口中查看導致代碼工作的changetracker中的實體時會發生什麼?我在這裏感到茫然,非常感謝任何幫助。提前致謝。

+0

我只想補充一點,這是一個控制器的動作裏面,如果該事項在所有。 – Dean

+0

而'member'和'centre'都不是'null'? –

+1

在'savechnages'行之前加上。 'context.Entry(member).State = EntityState.Modified;' – Mairaj

回答

0

我已經弄清楚它是什麼。會員POCO對了以下領域:

[必需] 公共虛擬帳戶

一個需要延遲加載的領域。這是吐出驗證錯誤,因爲它認爲沒有帳戶,當我在觀察窗口中打開實體時,但是,它迫使延遲加載啓動,因此加載帳戶。我已將[必需]關閉,現在它正在工作。

我們明白爲什麼我沒有在第一次看到驗證錯誤:/

相關問題