首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用多个SaveChanges()

调用多个SaveChanges()
EN

Stack Overflow用户
提问于 2015-02-04 23:04:54
回答 1查看 1.1K关注 0票数 0

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

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

代码语言:javascript
复制
    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();
                }
            }
        });
    }

第二种方法是向数据库提供对象。(添加到表中)

代码语言:javascript
复制
        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方法,但它也没有对我起作用(或者我可能用错了)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-05 02:24:30

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28333277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档