每个请求aspboilerplate的DbContext

时间:2017-12-08 08:42:07

标签: aspnetboilerplate

我需要为导入文件实现多线程后台作业。 我已经用后台工作(Hangfire)实现了它。但是,如果我使用一个线程,它会非常慢。 功能看起来像这样。

我使用非事务处理单元立即保存对db的更改。

var contactFound = await _contactRepository.FirstOrDefaultAsync(x => x.Email.ToLower() == contact.Email.ToLower());

            if (contactFound != null)
            {
                await _bjInfoManager.AddLog(args.JobId, "Found duplicated email: " + contact.Email);

            }
            else
            {
                contact.ContactListId = args.ContactListId;
                contact.Email = contact.Email.ToLower();

                await _contactRepository.InsertAsync(contact);

                //Save changes in db
                await CurrentUnitOfWork.SaveChangesAsync();
            }

当我尝试将它与Producer-Consumer Dataflow Pattern一起使用时,会出现问题。我抛出异常"在上一次异步操作完成之前,在此上下文中启动了第二个操作。"

问题是如何在此方法中创建隔离的DbContext。 请帮帮我。

1 个答案:

答案 0 :(得分:0)

交易不应该是多线程的。如果在UOW中创建新任务/线程,则可以在using块中使用IUnitOfWork.Begin(TransactionScopeOption.RequiresNew)创建一个分离的UOW。

参见链接

如果您使用的是Microsoft SQL Server,我建议您使用批量插入。它比实体框架快。

  

https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql