我尝试在一个数据库表上异步工作,并提交对它的更改,但它不像我所希望的那样工作。
这是我的第一个方法,在对象构造函数上运行一个任务,它不忙地等待集合中的一些新对象,并一个一个地处理它们。(从表中删除)
private static BlockingCollection<QueuedLog> queue = new BlockingCollection<QueuedLog>();
private void Start()
{
Task.Run(() =>
{
while (taskQueueActive)
{
using (var scope = new TransactionScope())
{
QueuedLog log = queueLogs.Take();
// I process it somehow here
uow.QueuedLogRepository.Delete(log);
if (queueLogs.Count == 0)
uow.Save();
scope.Complete();
}
}
});
}第二种方法是向数据库提供对象。(添加到表中)
using (var scope = new TransactionScope())
{
uow.MonitoringIdRepository.Add(logs.First(), out id);
uow.QueuedLogRepository.Add(logs, id);
uow.Save();
scope.Complete();
}这两种方法都使用相同的UnitOfWork对象和所需的存储库。
在运行应用程序之后,当队列任务运行时--当我向第二个方法发送新对象时,我将得到以下错误:
'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException‘类型的异常发生在EntityFramework.dll中,但未在用户代码中处理。附加信息:存储update、insert或delete语句影响到意外的行数(0)。实体可能已被修改或删除,因为实体是加载的。刷新ObjectStateManager条目。
问题是:如何摆脱这一例外?或者我还能用别的方式做呢?我已经尝试了新的EF6.0 BeginTransaction方法,但它也没有对我起作用(或者我可能用错了)。
发布于 2015-02-05 02:24:30
您不应该在多个线程之间共享上下文对象。您发布的错误消息实质上是声明上下文对象实现实体已被修改。
尝试为每个线程使用一个单独的上下文对象:Entity Framework Thread Safety
https://stackoverflow.com/questions/28333277
复制相似问题