【问题标题】:Entities may have been modified or deleted since entities were loaded. when using db.Entry(entity).State = EntityState.Modified;SaveChanges()自加载实体后,实体可能已被修改或删除。当使用 db.Entry(entity).State = EntityState.Modified;SaveChanges()
【发布时间】:2016-10-05 19:57:32
【问题描述】:

当使用以下代码遍历数据库行并在每次迭代中编辑数据时

 var entities = db.entities.Where(l => l.id > 28181 && l.id < 28425 && l.Geometry == null).ToList();
        HttpClient client = new HttpClient();
        HttpResponseMessage response = new HttpResponseMessage();
        foreach (model entity in entities)
        {

            string area = entity.address + " " + entity.city + " " + country;
            var address = String.Format("https://maps.googleapis.com/maps/api/geocode/json?key=AIzaSyArOWaWq_xXjAm68DlFFFqoxK7Z_ggYk9E&address=" + gebied);
            response = await client.GetAsync(address);
            var bekijk = response.StatusCode;
            if (response.IsSuccessStatusCode)
            {
                var data = response.Content.ReadAsStringAsync();
                var jObject = Newtonsoft.Json.Linq.JObject.Parse(data.Result);
                string status = jObject["status"].ToObject<string>();
                if (status== "OK")
                {
                    var geometryLocation = jObject["results"][0]["geometry"]["location"];
                    string lat = geometryLocation["lat"].ToObject<string>();
                    string lon = geometryLocation["lng"].ToObject<string>();
                    entity.Geometry = System.Data.Entity.Spatial.DbGeometry.FromText("POINT(" + lat + " " + lon + ")");
                    entity.Latitude = Convert.ToDecimal(lat.Replace('.', ','));
                    entity.Longitude = Convert.ToDecimal(lon.Replace('.', ','));
                    db.Entry(entity).State = EntityState.Modified;
                }

            }

        }
        db.SaveChanges();

db.SaveChanges(); 发生错误。即

存储更新、插入或删除语句影响了意外数量的行 (0)。自加载实体后,实体可能已被修改或删除。

我已经尝试过在 stackoverflow 上看到的解决方案,但没有任何效果。有没有人有任何线索?提前致谢。

【问题讨论】:

  • Entity Framework 找不到要更新的id 相同的实体时通常会出现该错误
  • 您的代码无法编译。这条线 foreach (kandidaten kandidaat in kandidaten) 应该改为:foreach (Entity entity in entities) 吗?
  • 我相信你 Adil Mammadov,但是当我在循环中设置断点时,我看到 id 在那里。那怎么没有找到PK呢?
  • 您是否在上下文中设置了全局“AsNoTracking()”等?您的错误是因为上下文跟踪的实体没有检测到任何更改,因此更新不会影响任何实体。
  • id是这种类型的唯一键吗?

标签: c# asp.net entity-framework


【解决方案1】:

您是否尝试手动更新实体?

使用包管理器控制台:

PM> Add-Migration MyMigration
...
PM> Update-Database

这可能会有所帮助:Automatic Code First Migrations

【讨论】:

  • 我们的项目是数据库优先。从 DB 更新模型并再次运行它,但仍然没有区别
  • 尝试保存每条记录的更改,并查看它是否发生在特定记录或所有记录中。这个请求的结果是返回数据?看看这是否对您有帮助:if (!ModelState.IsValid) { return BadRequest(ModelState); }
【解决方案2】:

分配值并将其保存在不同的方法中以某种方式修复它。 谁能告诉我为什么?

    public async void FirstMethod()
    {

        var entities = db.entities.ToList();

        HttpClient client = new HttpClient();
        HttpResponseMessage response = new HttpResponseMessage();
        foreach (var entity in entities)
        {

            string area= entity.address + " " + entity.city + " " + land;
            var address = String.Format("https://maps.googleapis.com/maps/api/geocode/json?key=AIzaSyArOWaWq_xXjAm68DlFFFqoxK7Z_ggYk9E&address=" + area);
            response = await client.GetAsync(address);

            if (response.IsSuccessStatusCode)
            {
                var data = response.Content.ReadAsStringAsync();
                var jObject = Newtonsoft.Json.Linq.JObject.Parse(data.Result);
                string status = jObject["status"].ToObject<string>();

                if (status == "OK")
                {
                    var geometryLocation = jObject["results"][0]["geometry"]["location"];
                    string lat = geometryLocation["lat"].ToObject<string>();
                    string lon = geometryLocation["lng"].ToObject<string>();
                    SecondMethod(lat+" "+lon ,entity);
                }
            }
        }
    }


    public void SecondMethod(string preometry, model entity)
    {
        entity.Geometry = System.Data.Entity.Spatial.DbGeometry.FromText("POINT(" + preometry + ")");
        string[] latLon = preometry.Split(' ');
        entity.Latitude = Decimal.Parse(latLon[0].Replace(".", ","));
        entity.Longitude = Decimal.Parse(latLon[1].Replace(".", ","));
        db.Entry(entity).State = EntityState.Modified;
        db.SaveChanges();
    }

【讨论】:

    猜你喜欢
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多