0

我有一个带有端点“DeleteFolder”的 WebAPI 解决方案。看起来像这样:

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

我的 _service 是 DtoService.cs 的一个实例,其中包含:

    public DtoService()
    {
        _repository = new RepositoryService();
    }
    public void DeleteFolder(int folderId)
    {
        _repository.DeleteFolder(folderId);
    }

最后,在我的存储库中,我有这个:

    public RepositoryService()
    {
        _db = new AppDbContext();
    }
    public void DeleteFolder(int folderId)
    {
     var folder = GetFolder(folderId);
     _db.Folders.Remove(folder);
     SaveChanges();
    }

其中 _db 是我项目的 DbContext 的一个实例,在 Repository 类的构造函数中定义一次。

当我向 delete 方法发送一堆异步 AJAX 调用时,我得到“在创建模型时无法使用上下文。”。我可以看到每个 RepositoryService 的新实例都在旋转,但是如果我在

var 文件夹 = GetFolder(folderId);

然后跨步,它再次被击中,所以似乎另一个实例试图在第一个完成之前击中相同的代码,这在某种程度上导致了这个错误被抛出。

我的 WebAPI 层或 DTO 服务层中没有任何对我dbContext的引用 - 如果可能的话,我更愿意保持这种方式。我尝试将 DeleteFolder 代码包装在 a 中using (_db = new AppDbContext),但这也不起作用——而且我觉得用新的 dbcontext 填充我的所有存储库方法不可能是推荐的解决方案。

这里发生了什么?任何提示都会很棒,我在这里完全不知所措。

4

1 回答 1

0

一个线程正在初始化您的上下文以响应请求(这是一个漫长的过程),另一个线程尝试使用该上下文。第二个请求认为上下文已准备好使用,您会收到以下异常:“在创建模型时无法使用上下文。” 以下代码显示了如何force database initialization在 EF Code First 中启动:

protected void Application_Start() {
     // ... 

     // Initializes and seeds the database.
     Database.SetInitializer(new MyDBInitializer());
 
     // Forces initialization of database on model changes.
     using (var context = new ApplicationDB()) {
          context.Database.Initialize(force: true);
     }

     // ...
}
于 2013-07-07T16:43:42.310 回答