EF中我的dbcontext的两个不同实例与“;在创建模型时不能使用上下文&”;

本文关键字:模型 创建 不能 上下文 实例 dbcontext 我的 两个 EF | 更新日期: 2023-09-27 18:21:17

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

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

My_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调用时,我会得到"在创建模型时不能使用上下文"

var folder=GetFolder(folderId);

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

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

这是怎么回事?任何提示都会很棒,我在这里完全不知所措。

EF中我的dbcontext的两个不同实例与“;在创建模型时不能使用上下文&”;

一个线程正在初始化您的上下文以响应请求(这是一个漫长的过程),另一个线程则试图使用上下文。第二个请求认为上下文已准备好使用,您会得到以下异常:"在创建模型时无法使用上下文。"以下代码显示了如何在启动时首先在EF代码中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);
     }
     // ...
}