首页 文章

我的dbcontext在EF中的两个不同实例与“在创建模型时不能使用上下文”发生冲突 .

提问于
浏览
0

我有一个带有 endpoints “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 folder = GetFolder(folderId);

然后跳过,它再次被击中,所以看起来另一个实例在第一个完成之前尝试击中相同的代码,这会以某种方式导致抛出此错误 .

我的WebAPI层或DTO服务层中没有任何对我的 dbContext 的引用 - 如果可能的话我宁愿保持这种方式 . 我尝试将DeleteFolder代码包装在_2355658中,但这并不是推荐的解决方案 .

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

1 回答

  • 0

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

相关问题