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

Ali*_*cid 4 c# asp.net-mvc entity-framework dbcontext

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

modelBuilder.Entity<MyModel>().MapToStoredProcedures();
Run Code Online (Sandbox Code Playgroud)

我使用插入更新和删除没有任何问题。但出于某种目的我想使用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();
}
Run Code Online (Sandbox Code Playgroud)

小智 6

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