首页 > 解决方案 > 数据库注册表未完全更新

问题描述

我正在用 C# 开发一个应用程序,它需要更新现有数据库中的一些条目。我正在使用Linq。

好的,所以,我有这个用户及其属性(Id、Name、City、ToUpdate、ToInsert、IsActive、IdUserUpdate 等)。

我的应用程序有一个 foreach,在里面我正在为每次迭代编辑数据库上的现有注册表。

它是这样的:

myList.ForEach(X => {
    var oldRegistry = database.MyTable.FirstOrDefault(Y => Y.Id == X.Id);

    oldRegistry.City = X.City;
    oldRegistry.IdUserUpdate = -3;
    oldRegistry.ToUpdate = false;
    oldRegistry.ToInsert = true;
    oldRegistry......................

    database.SaveChanges();
});

问题是从第二次迭代开始,oldRegistry 没有更新其 ToUpdate 和 ToInsert 字段(数据库中的两个位)。

我已经测试了几乎所有东西,但什么都没有......如果我在 savechanges 上添加一个断点,我可以扫描即将保存到数据库中的 oldRegistry 属性,一切都应该如此,但是当我检查数据库时在 SaveChanges 之后,并不是所有的字段都被更新(IdUserUpdated 被更新,但 ToUpdate 和 ToInsert 没有被更新)。

我尝试重新加载数据库的实体,但由于我的 foreach 每次都有 2000 次迭代,清除它们需要大量的时间(每次迭代 10 个实体)。代码如下:

foreach (var entity in database.ChangeTracker.Entries())
   {
    entity.Reload();
   }

标签: c#databaseentity-frameworklinq

解决方案


您的代码看起来是正确的。如果有任何机会,请尝试以下代码一次。

var updateIds = myList.Select(x => x.Id).ToList();
// Get all the records which needs to be updated in a single call
var recordsToBeUpdated = database.MyTable.Where(x => updateIds.Contains(x.Id));

foreach (var record in recordsToBeUpdated)
{
   var list = myList.FirstOrDefault(x => x.Id == record.Id);

   record.City = list.City;
   record.IdUserUpdate = -3;
   record.ToUpdate = false;
   record.ToInsert = true;
}

// Call SaveChanges after updating the values for all the records
database.SaveChanges();

推荐阅读