【问题标题】:Two different instances of my dbcontext in EF are colliding with "The context cannot be used while the model is being created."EF 中我的 dbcontext 的两个不同实例与“创建模型时无法使用上下文”发生冲突。
【发布时间】:2013-07-05 00:03:45
【问题描述】:

我有一个带有端点“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 代码包装在 using (_db = new AppDbContext) 中,但这也不起作用 - 我觉得用新的 dbcontext 填充我的所有存储库方法不可能是推荐的解决方案。

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

【问题讨论】:

    标签: c# entity-framework-4 ef-code-first repository-pattern dbcontext


    【解决方案1】:

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

    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);
         }
    
         // ...
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多