0

我有一個端點「DeleteFolder」的WebAPI解決方案。這看起來是這樣的:EF中my dbcontext的兩個不同實例與「在創建模型時無法使用上下文」相沖突。

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的引用 - 如果可能,我寧願保留它。我嘗試在using (_db = new AppDbContext)中包裝DeleteFolder代碼,但是這也不起作用 - 而且我覺得要用全新的dbcontext胡說所有的存儲庫方法不可能是推薦的解決方案。

這是怎麼回事嗎?任何提示都會很棒,我完全不知所措。

回答

0

一個線程正在初始化您的上下文以響應請求(這是一個漫長的過程),另一個線程嘗試使用上下文。第二個請求認爲,上下文是準備就緒,你會得到這個異常:「正在創建模型,而上下文不能使用」 下面的代碼演示瞭如何force database initialization在EF代碼第一次啓動時:

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

  // ... 
} 
相關問題