2016-09-19 48 views
1

我有以下代碼。當我跟蹤代碼時,我看到City不爲空,它的值發生變化,然後SaveChanges被調用,但不會保存更改。在這個項目中大約有數百個類似的代碼,並且它們都可以工作。什麼問題可以在這裏?實體框架SaveChanges被調用,但它不工作

 using (Entities db = new Entities()) 
     { 
     long id = (long)((string)data.data[i].id).ParseLong(); 
     City city = db.Cities.FirstOrDefault(c => c.Id == id); 
     if (city != null) 
      { 
      city.FromLat = data.data[i].fromlat; 
      city.ToLat = data.data[i].tolat; 
      city.FromLng = data.data[i].fromlng; 
      city.ToLng = data.data[i].tolng; 
      if (city.FromLat > city.ToLat) More.Swap(ref city.ToLat, ref city.FromLat); 
      if (city.FromLng > city.ToLng) More.Swap(ref city.FromLng, ref city.ToLng); 
      db.SaveChanges(); 
      } 
     } 
+1

被傳遞到數據庫SQL什麼,如果有的話? – stuartd

+0

@startart沒有任何東西。這是整個代碼。 –

+0

是否有例外? – Sampath

回答

4

您沒有提供您的模型,但使用這些線路ref關鍵字:

if (city.FromLat > city.ToLat) More.Swap(ref city.ToLat, ref city.FromLat); 
if (city.FromLng > city.ToLng) More.Swap(ref city.FromLng, ref city.ToLng); 

清楚地表明,FromLatToLatFromLngToLng成員領域,因而不會被映射到數據庫列。讓他們性能並使用不同的代碼交換(時間長一點,但工作):

if (city.FromLat > city.ToLat) { var temp = city.FromLat; city.FromLat = city.ToLat; city.ToLat = temp; }; 
if (city.FromLng > city.ToLng) { var temp = city.FromLng; city.FromLng = city.ToLng; city.ToLng = temp; }; 
+0

你是一個天才。我忘了'{get; set;}'in'public Nullable FromLat {get;組; ''但我不知道爲什麼它仍然無法正常工作。但是我知道我應該檢查映射 –

+1

如果使用'AutomaticMigrationDataLossAllowed'設置爲'true'的自動遷移,很可能您的原始數據不在這些列中(我的測試環境在回答測試時發生了什麼)。再次使它們的屬性後,我的列被帶回,填充零(或'null's) –

0

您沒有將項目添加到其集合(db.Cities.Add(city))。

如果你想更新實體:

db.Entry(city).State = EntityState.Modified; 
db.SaveChanges(); 
+3

之前編寫了很多這樣的代碼,該代碼已經在數據庫中。我讀它並改變它 –

0

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

應該做的伎倆。

的SaveChanges之前加入這一權利

+3

恕我直言上下文將默認做跟蹤。它的冗餘標記爲在這種情況下被修改 – Eldho

+0

不,它沒有。當城市的屬性發生變化時,EntityState.Modified會自動更改 –

0

嘗試將狀態設置爲修改通過

db.Entry(city).State = System.Data.Entity.EntityState.Modified; 

或者你也可以手動設置爲修改已更改的每個領域。

相關問題