C# 数据库注册表未完全更新

C# 数据库注册表未完全更新,c#,database,entity-framework,linq,C#,Database,Entity Framework,Linq,我正在用C#开发一个应用程序,需要更新现有数据库中的一些条目。我正在使用Linq 好的,我有这个用户及其属性(Id、Name、City、ToUpdate、ToInsert、IsActive、IdUserUpdate等等) 我的应用程序有一个foreach,在它里面,我正在为每次迭代编辑数据库上的现有注册表 事情是这样的: myList.ForEach(X => { var oldRegistry = database.MyTable.FirstOrDefault(Y => Y

我正在用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后检查数据库时,并不是所有字段都会更新(idUserUpdate会更新,但ToUpdate和ToInsert不会更新)

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

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

您的代码看起来是正确的。如果可能的话,请尝试一下下面的代码

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();

ID是数据库中的主键吗?如果ID是主键,则需要删除该行并添加新的行。使用存储过程,然后在存储过程中执行更新,而不是删除和添加,可能会更快。对于其他记录,
ToUpdate
ToInsert
已经具有您想要更新的相同值。您能确认情况是否不是这样吗?@jdweng是的,ID是数据库中的主键。@SowmyadharGourishetty否。事实并非如此。在数据库中,它们都设置为false。请阅读该行。没关系。对具有主键的表所做的任何更改都需要删除行。SQL Server有两个命令1)插入2)更新。当您有一个PK时,只有当PK不在数据库中时,插入才会起作用,而更新只在项目在数据库中时起作用。实体仅使用Insert。感谢您的回复。我理解你的想法。我将看一看,看能否在我们的代码中实现这一点。