在LINQ to Entities中實例化上下文

entity entity-framework linq linq-to-entities

我已經看到了程序員在代碼中創建實體上下文時所採用的兩種不同方式。

第一個是這樣的,你可以在MSDN代碼示例中找到它:

public void DoSomething() {
     using (TaxableEducationEntities context = new TaxableEducationEntities()) {
          // business logic and whatever else
     }
}

第二種是在一些封裝了業務邏輯的類中將上下文創建為私有屬性。所以你會有類似的東西:

public class Education_LINQ {

        private TaxableEducationEntities context = new TaxableEducationEntities();

        public void DoSomething() {
            var result = from a in context.luAction
                         select a;

            // business logic and whatever else
        }
}

哪種方式更有效?

假設您有兩個方法,一個名為DoSomething1(),另一個名為DoSomething2(),兩個方法都包含using語句來打開上下文並對其執行任何操作。你是否一個接一個地調用一個方法,是否會有任何多餘的開銷,因為基本上兩個方法都創建了上下文,然後在它們完成後清理它?而不是只有一個私有屬性在實例化類對象時創建,然後在對象超出範圍時進行清理?

一般承認的答案

每次創建一個新的ObjectContext確實涉及“一些”開銷。實質上,所涉及的開銷是將元數據從全局高速緩存複製到與特定ObjectContext相關聯的元數據中。

這種開銷相對較小,因此通常不值得擔心,尤其是當您考慮使用模式中固有的額外安全性時。

對我來說,你選擇哪個選項取決於:

  1. 你的包裝課可能有多久了?如果它存在很長時間,ObjectContext可能會增長,以阻止許多實體隨著時間的推移而減速。所以每次一個新的ObjectContext可能是一個好主意。
  2. 對包裝類上的方法的調用是否同步? ObjectContext類本身不是線程安全的,所以如果你使用第二個模式,你需要確保你的包裝類/存儲庫是線程安全的,如果你期望多個線程調用它。
  3. 方法基本上不相關嗎?如果是這樣,如果他們在方法之間共享一個上下文,則可能會出現意外的副作用。

一般來說,我的建議是,如果這些方法是無狀態的,即火災並忘記每種方法的新上下文可能是一個好主意。

但是,如果你有一個相對短暫的有狀態形式或某些東西,那麼共享上下文可能是一個更好的主意。

更新:我花時間整理了一個更完整的答案


熱門答案

如果這就是你的意思,第二個選項實際上並不會自行清理。我更喜歡每次都使用ObjectContext版本,因為我之後不必處理它。我不確定我的問題是否正確......今天編程太多了。

public class UserManagerRepository : IUserManagerRepository, IDisposable
{
    private readonly Entities _context = new Entities();
    private bool _disposed;

    public User Create(User user, int countryId)
    {
        user.Country = GetCountry(countryId);
        _context.AddToUser(user);
        _context.SaveChanges();
        return user;
    }
}

然後使用此存儲庫我執行以下操作:

using(var repository = new UserManagerRepository())
{
    repository.Create(user);
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因