2

在我的 WebAPI 控制器中,我有这个:

   [HttpDelete]
    public HttpResponseMessage DeleteFolder(int id)
    {
        _service.DeleteFolder(id);
        return Request.CreateResponse(HttpStatusCode.OK, "Deleted");
    }

_service 是使用 _db 的数据库访问服务 - 我项目的 DbContext 的一个实例,在服务类的构造函数中定义一次。

在我的客户端中,我使用 for 循环向 delete 方法发送了一堆异步 AJAX 调用,试图连续删除多个文件夹。就是这样的东西:

基础提供程序在打开时失败。

还有这个:

创建模型时不能使用上下文。

开始发生。我有一种感觉,这是由于比赛条件造成的,但如果是这种情况,我不确定如何修复它。我应该为每个调用创建一个新的 dbcontext 实例吗?如果是这样,应该在哪里创建?在 repository.cs 的每个方法中(为每个方法的使用创建一个 dbContext)?

任何帮助将非常感激。

4

1 回答 1

0

是的,每次调用都需要一个单独的 DbContext。来自文档

此类型的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。

您可以做的(例如,取决于您使用事务的方式)是使用工作单元模式,如果 EF 的情况基本上意味着将您包装DbContext在一个类中(您不希望它暴露 EF 特定的类,如 DbContext到您的业务类),以便您在您的应用程序代码(或者,根据分层,业务代码)可以编写类似的东西;

[HttpDelete]
public HttpResponseMessage DeleteFolder(int id)
{
    using(var uow = new UnitOfWork()) {  // Creates a new DbContext
        _service.DeleteFolder(uow, id);
        uow.Commit();          
        return Request.CreateResponse(HttpStatusCode.OK, "Deleted");
    }                                    // Uncommitted UoW rolls back on Dispose
}                                        // ie on unhandled exceptions.

...或者如果您认为使用每个服务/存储库方法传递 UoW 很烦人(我愿意),您可以让 UnitOfWOrk 构造函数将其保存为“当前活动的工作单元” HttpContext.Current.Items,以便任何服务/存储库都可以获取需要时的当前工作单元。

于 2013-07-07T05:37:09.700 回答