调用多个SaveChanges()

时间:2015-02-04 23:04:54

标签: c# entity-framework

我试图在一个数据库表上异步工作并提交更改,但它并不像我希望的那样工作。

这是我的第一个方法,我在对象构造函数上运行一个任务,它非忙于等待集合中的一些新对象并逐个处理它们。 (从表中删除)

    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 对象和所需的存储库。

运行应用程序后,当队列任务正在运行时 - 当我向第二种方法发送新对象时,我收到以下错误:

  

类型&#39; System.Data.Entity.Infrastructure.DbUpdateConcurrencyException&#39;的例外情况发生在EntityFramework.dll中但未在用户代码中处理。附加信息:存储更新,插入或删除语句会影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。刷新ObjectStateManager条目。

问题是:如何摆脱这种异常?或者我怎么能以其他方式做到这一点?我已经尝试过新的EF 6.0 BeginTransaction方法了,但它对我来说也没有用(或者我用错了)。

1 个答案:

答案 0 :(得分:2)

您不应跨多个线程共享上下文对象。您发布的错误消息实质上是说明上下文对象实现了实体已被修改。

尝试为每个线程使用单独的上下文对象:Entity Framework Thread Safety