簡體   English   中英

EF(實體框架)使用“使用”語句

[英]EF (entity framework) usage of “using” statement

我有一個關於MVC的項目。 我們為數據庫交易選擇了EF。 我們為BLL層創建了一些管理器。 我找到了很多例子,其中usingusing ”語句,即

public Item GetItem(long itemId)
    {
        using (var db = new MyEntities())
        {
            return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
        }
    }

這里我們創建一個DBcontext MyEntities()的新實例。 我們使用“ using ”以“確保正確使用IDisposable對象”。

這只是我經理中的一種方法。 但我有十多個。 每次我從管理器調用任何方法時,我將使用“ using ”語句並在內存中創建另一個DBcontext。 垃圾收集器(GC)什么時候處理它們? 有人知道嗎?

但是管理器方法有其他用法。 我們創建一個全局變量:

private readonly MyEntities db = new MyEntities();

並且在沒有“ using ”語句的每個方法中使用DBcontext。 方法看起來像這樣:

public Item GetItem(long itemId)
{
    return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
}

問題:

  1. 使用DBcontext變量的正確方法是什么?
  2. 如果我們不使用“ usage ”聲明(因為它會影響性能)怎么辦 - GC會為此做些什么?

我是EF使用中的“新手”,但仍然沒有找到這個問題的明確答案。

我想你會發現許多暗示這種風格的模式。 不只是我或Henk DBContext處理

  • 是的,理想情況下使用DBContext子類型的語句
  • 使用Using管理的更好的工作單元模式,具有上下文並處理上下文只有很多UoW示例中的一個,這個來自Tom Dykstra
  • 每個Http請求都應該是新的工作單元管理器
  • 上下文不是線程安全的,因此請確保每個線程都有自己的上下文。
  • 讓EF在幕后緩存東西。
  • 測試上下文創建時間。 經過幾次Http請求。 你還有問題嗎?
  • 如果將上下文存儲在靜態中,則會出現問題。 任何類型的並發訪問都會受到影響,如果您使用並行AJAX調用,假設使用靜態單個上下文時會出現90 +%的問題。

對於一些性能提示,非常值得一讀

使用DBContext變量的正確或最佳實踐方法是使用。

    using (var db = new MyEntities())
    {
        return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault();
    }

好處是許多事情都是我們自動完成的。 例如,一旦完成代碼塊,就會調用dispose。

每個MSDN EF使用DbContext

上下文的生命周期在創建實例時開始,在實例處理或垃圾收集時結束。 如果您希望將上下文控制的所有資源放置在塊的末尾,請使用。 使用時,編譯器會自動創建一個try / finally塊,並在finally塊中調用dispose。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM