2016-09-19 75 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; 

或者你也可以手动设置为修改已更改的每个领域。

相关问题