gpt4 book ai didi

c# - EF Core - 在上一个操作完成之前,在此上下文中启动了第二个操作。不保证任何实例成员都是线程安全的

转载 作者:行者123 更新时间:2023-12-04 11:53:09 26 4
gpt4 key购买 nike

我正在使用 EF Core 2.1我正在尝试使用 Tasks 一次性更新多个实体(TPL):

public async Task UpdateAttendance(IEnumerable<MyEvents> events)
{
try
{
var tasks = events.Select(async entity =>
{
await Task.Run(() => Context.Entry(entity).Property(x => x.Attendance).IsModified = true);
await Context.SaveChangesAsync();
});

await Task.WhenAll(tasks);
}
catch (Exception ex)
{
throw new Exception(ex.Message ?? ex.InnerException.Message);
}
}

但这会引发以下错误。

A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.



启动文件
services.AddScoped<IMyRepository, MyRepository>();

我该如何解决这个问题?

最佳答案

你不能那样做。 EF Core(与之前的 EF 6 一样)不是线程安全的。

在开始下一个任务之前等待任务

var tasks = events.Select(async entity =>
{
await Task.Run(() => Context.Entry(entity).Property(x => x.Attendance).IsModified = true);
await Context.SaveChangesAsync();
});

await Task.WhenAll(tasks);

在这里,您正在并行启动多个任务并等待它们。你将不得不循环它
foreach(var entity in events) 
{
Context.Entry(entity).Property(x => x.Attendance).IsModified = true;
});
await Context.SaveChangesAsync();

不确定为什么要逐个保存它(因此,示例更改为在调用 SaveChangesAsync() 之前执行所有修改的标志),因为它非常低效。更新所有属性,然后最后运行 SaveChanges 更有意义,因为 EF Core 将在您保存更改时保存所有更改/跟踪的实体。当出现问题时也更容易回滚(SaveChangesAsync 中的操作发生在事务范围内)

关于c# - EF Core - 在上一个操作完成之前,在此上下文中启动了第二个操作。不保证任何实例成员都是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54843810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com