2

嘿,我剛剛學會了如何使用擴展方法,並非常興奮地在我當前的項目中實現它。如何在靜態類中使用dbcontext? (ObjectDisposedException)

我的目標: 我想查一下我的表中是否存在一個輔助類的條目,因爲我打算使用它在多個控制器能夠確定在我的導航欄顯示其導航鏈接:enter image description here

我的問題: 我不知道如何來訪問我的DbContext在我的靜態輔助類。我的dbcontext控制器需要一個參數,我不知道如何通過我的靜態類。我認爲創建一個新的dbcontext將解決我的範圍問題下面解釋,但我不明白我可以如何將選項參數傳遞給我的構造函數。

enter image description here

它是在Startup.cs類當前配置。 enter image description here

我的嘗試: 薪火ApplicationDbContext作爲論據。這適用於我的控制器中的單個方法調用,但在調用多個擴展方法時(要檢查用戶擁有哪個遊戲帳戶),我得到一個ObjectDisposedException。

ObjectDisposedException:無法訪問處置的對象。造成這種錯誤的一個常見原因是處理從依賴注入解決的上下文,然後嘗試在應用程序的其他地方使用相同的上下文實例。如果您在上下文中調用Dispose(),或者在使用語句中包裝上下文,則可能會發生這種情況。如果您正在使用依賴注入,則應該讓依賴注入容器負責處理上下文實例。 對象名稱:'ApplicationDbContext'。

從我的理解是一個範圍問題,其中第一個方法調用處理上下文,當我試圖在下一個調用中使用相同的上下文?我能做些什麼來解決這個問題?

我試着讀這個鏈接Cannot access a disposed object in ASP.NET Core when injecting DbContext但它沒有幫助我,因爲它需要Startup.cs類中的ApplicationBuilder。

enter image description here

解決方案更新 我設置在每一個的DbContext方法調用之後,因爲我把它改成一個變量。相反,我直接調用它傳遞的上下文中,它的工作原理:

enter image description here

感謝大衛和Simon

+1

你是如何調用* *'HasDota2Account()'?你是否傳遞了一個處理過的'DbContext'? '_context'從哪裏來?這個錯誤似乎表明它在調用'UpdateNavLinks()'之前的確處理了。所以看起來你不應該處理它,或者應該在該方法中使用本地實例化的上下文。試圖共享數據上下文對象通常會導致這個問題。 – David

+0

此外,在HasDota2Account數據庫是上下文相同的對象;當數據庫被處置,所以上下文是。如果嘗試在調用HasDota2Account之後使用上下文,它會給出相同的異常。 –

+0

我從我的第一張圖片中的控制器調用它。 _context_是我的控制器上的一個字段,在構造函數中得到實例化。我不知道它是否被處置。我不認爲我知道如何實例化本地_dbcontext _,因爲它需要選項參數,我無法通過外部_of startup.cs_ –

回答

2

呀,所以,雖然擴展名是新的,有光澤到你,那並不意味着你應該使用他們的一切。首先,擴展應該與它們運行的​​類型有邏輯聯繫。例如,如果你有一個string,像ToUpper()這樣的東西作爲擴展是有意義的,因爲它修改並返回一個字符串。就像你想要做的一樣:只是使用引用的值返回完全外部類型是違反了擴展模式。

其次,擴展不應該與數據庫之類的東西交互。特別是在這裏,擴展的靜態本質完全不符合EF上下文對象的概念。你甚至可以讓它工作的唯一方法就是在擴展中每次調用擴展時都會新建一個上下文。這是一個很好的方式來搞砸EF對象跟蹤的東西,以及一個很好的方式來泄漏內存。

多空,不要這樣做。

如果你只是想把這些代碼分解出來,你有更好的選擇。例如,您實際上可以直接將方法添加到您的上下文中。

public class ApplicationDbContext : DbContext 
{ 
    ... 

    public bool HasDota2Account(string id) 
    { 
     return Dota2Accounts.Any(m => m.ApplicationUserId == id); 
    } 
} 

然後,在你的控制器,你可以簡單地做:

var hasDota2Account = context.HasDota2Account(User.Identity.GetUserId()); 
+0

謝謝你的解釋。每天學習新東西。 –