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