C# 实体框架下的并发访问

C# 实体框架下的并发访问,c#,multithreading,entity-framework,C#,Multithreading,Entity Framework,我正在开发一个与数据库通信的信号器应用程序。我使用Entity Framework 6管理数据库 我想实现一个计划任务,它将删除给定表中的一些记录 问题是这个任务没有在我的应用程序的主线程上运行。因此,如果此任务在主线程尝试读取同一条记录时删除该记录,则应用程序将崩溃 我以这种方式管理数据库上下文:使用(var dbContext=new DatabaseContext()) //获取和删除记录的代码。。。 dbContext.saveChanges() 避免并发问题的最佳解决方案是什么?我应该

我正在开发一个与数据库通信的信号器应用程序。我使用Entity Framework 6管理数据库

我想实现一个计划任务,它将删除给定表中的一些记录

问题是这个任务没有在我的应用程序的主线程上运行。因此,如果此任务在主线程尝试读取同一条记录时删除该记录,则应用程序将崩溃

我以这种方式管理数据库上下文:
使用(var dbContext=new DatabaseContext())
//获取和删除记录的代码。。。
dbContext.saveChanges()

避免并发问题的最佳解决方案是什么?我应该强制在主线程上运行计划任务吗?如果是,我怎么做?或者我应该使用
TransactionScope
类使用事务锁吗

编辑

场景:每个任务执行间隔500毫秒

第一次调用的执行1任务=>新建dbContext实例=>获取记录=>删除记录=>保存更改

同时,再次调用任务

第二次调用的执行2任务=>新的dbContext实例(由于第一个任务仍在运行,两个dbContext对象处于活动状态)=>get record=>delete record=>saveChanges崩溃,因为它在第一次时已经执行了相同的操作。

异常:
storeupdate、insert或delete语句影响了意外的行数(0)。实体加载后可能已被修改或删除。


谢谢

,如果此任务在主线程尝试读取同一条记录时删除了一条记录,则应用程序将崩溃。
我从这里开始。当并发访问数据库时,应用程序不应该崩溃。为什么会崩溃
SaveChanges
将操作包装在事务中,因此实际上不需要
TransactionScope
。避免并发问题的最佳方法是正确管理依赖关系-没有办法为您提供一个简单的1-2-3任务列表来实现这一点。另外,在ASP.NET应用程序中使用“调度线程”是一个糟糕的想法。这太广泛了。您基本上是在询问一般的并发策略。有很多解决方案,我不确定您是否对这些概念足够熟悉,从而理解一个好的答案。我认为你需要先对这个话题进行一些探索,并更具体地问,如果有必要的话。