使用AutoDetectChangesEnabled = false时实体框架更新数据库问题

时间:2018-10-07 10:39:55

标签: c# asp.net-mvc entity-framework dbcontext

我使用实体框架和存储过程。

modelBuilder.Entity<MyModel>().MapToStoredProcedures();

我使用了插入更新和删除没有问题。但是出于某种目的,我想使用AutoDetectChangesEnabled = false;

在该实体不再起作用之后,SaveChanges之后数据库中没有任何更改。但是当我评论AutoDetectChangesEnabled或将其设置为true时,效果很好。

这是我的代码:我从Excel中读取并导入数据库:

dt = exc.ReadExcel(address, ".xlsx");

using (var db = new Context())
{
    db.Configuration.AutoDetectChangesEnabled = false;

    for (int i = 1; i < dt.Rows.Count; i++)
    {
        int id = int.Parse(dt.Rows[i][0].ToString());

        var thisChah = db.MyModel.Find(id);

        if (thisChah == null)
        {
            continue;
        }

        thisChah.f1 = dt.Rows[i][1].ToString();
        thisChah.f2 = dt.Rows[i][2].ToString();
        thisChah.f3 = dt.Rows[i][3].ToString();
        thisChah.f4 = dt.Rows[i][4].ToString();
        thisChah.f5 = dt.Rows[i][5].ToString();
        thisChah.f6 = dt.Rows[i][6].ToString();
        thisChah.f7 = dt.Rows[i][7].ToString();

        LogsAnyThing("row " + i + "- OK ");

        if(i % 50 == 0)
        {
            int result = db.SaveChanges();

            if (result > 0)
            {
                LogsAnyThing("row " + i + "- Added ");
            }
        }
    }

    db.SaveChanges();
}

1 个答案:

答案 0 :(得分:1)

由于您已经关闭了AutoDetectChanges,因此您需要在尝试调用SaveChanges()之前显式告诉上下文查找任何更改。您可以通过在调用db.SaveChanges()之前添加此语句-db.ChangeTracker.DetectChange()来完成此操作。没有这种上下文,就不会意识到对模型进行了任何更改。 您可以阅读更多@@ https://docs.microsoft.com/en-us/ef/ef6/saving/change-tracking/auto-detect-changes