C# 数据库注册表未完全更新
我正在用C#开发一个应用程序,需要更新现有数据库中的一些条目。我正在使用Linq 好的,我有这个用户及其属性(Id、Name、City、ToUpdate、ToInsert、IsActive、IdUserUpdate等等) 我的应用程序有一个foreach,在它里面,我正在为每次迭代编辑数据库上的现有注册表 事情是这样的: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
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。感谢您的回复。我理解你的想法。我将看一看,看能否在我们的代码中实现这一点。