我使用实体框架和存储过程。
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();
}
答案 0 :(得分:1)
由于您已经关闭了AutoDetectChanges,因此您需要在尝试调用SaveChanges()之前显式告诉上下文查找任何更改。您可以通过在调用db.SaveChanges()之前添加此语句-db.ChangeTracker.DetectChange()
来完成此操作。没有这种上下文,就不会意识到对模型进行了任何更改。
您可以阅读更多@@ https://docs.microsoft.com/en-us/ef/ef6/saving/change-tracking/auto-detect-changes