在数据库中设置所有标志的快速方法

本文关键字:方法 标志 数据库 设置 | 更新日期: 2023-09-27 18:12:21

我正在寻找一种快速的方法来设置表中的所有标志,所以我尝试了这个:

using (var db = new PlaceDBContext())
{
    Parallel.ForEach(db.Companies.Where(x => x.CheckedCompaniesHouse == true).ToList(),async (c) =>
    {
        c.CheckedCompaniesHouse = false;
        await db.SaveChangesAsync();
    });
}

但是这不起作用,它给出了错误:

"在上一个上下文之前开始的第二个操作异步操作完成。使用'await'来确保任何异步操作在调用另一个方法之前已经完成在这方面。不保证任何实例成员都是线程安全的。"

我很确定我以前做过类似的事情,它工作得很好。这种方法可行吗?

有更好的方法吗?

在数据库中设置所有标志的快速方法

实现目标的最佳方法之一是使用实体框架扩展库:

  db.Companies
    .Where(x => x.CheckedCompaniesHouse == true)
    .Update(t => new Company { CheckedCompaniesHouse = false });

使用此库可以避免将要修改的实体加载到内存中。我上面展示的代码将被转换为sql更新批处理。

你试过吗?

db.YourTable.Where(x => x.TheId == TheParameterId && x.AnotherColumn == true).ToList().ForEach(x =>
{
    x.IsActive = false; x.UpdatedTimeStamp = DateTime.Now;
});
db.SaveChanges();

我不知道是否有一个简单的方法来做到这一点,没有扩展和其他库。

但是EF不是很擅长这样的多次更新,你为什么不在Dapper上尝试一下呢?

也有async方法

你可以用简单的ADO来做。. NET和SQL.

类似:

connection.Execute("UPDATE Table SET Field = NewValue WHERE Column = @Parameter", new { Parameter = someParameterValue }); 
https://github.com/StackExchange/dapper-dot-net