c# - 数据库注册表未完全更新
问题描述
我正在用 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();
}
解决方案
您的代码看起来是正确的。如果有任何机会,请尝试以下代码一次。
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();
推荐阅读
- speech-to-text - 使用 Watson Speech-to-text JS SDK 立即关闭 WebSocket
- vuejs2 - 在 Vue 中使用 Materialize-css 时未定义 M
- python - 查找某个键的最大值
- javascript - 列出未附加的文档元素
- python - 没有名为“gensim.sklearn_api”的模块
- php - Yii2/PHP 日期格式化程序秒和语言环境
- reactjs - React Boilerplate:当数据进入时,哑组件重新渲染
- python - 使用 Python/C API 创建 python 包时出现“导入错误:DLL 加载失败:%1 不是有效的 Win32 应用程序”
- google-bigquery - BQ 中的转义分隔符
- python - 如何调用我在 python 的 if 语句中分配的变量?