EF (entity framework) usage of "using" statement

c#, dbcontext, entity-framework, garbage-collection, using-statement

Solution

I think you will find many suggesting this style of pattern. Not just me or Henk DBContext handling

- Yes, Ideally Using statements for DBContext subtypes

- Even better Unit Of Work patterns that are managed with Using, that have a context and dispose the context Just 1 of many UoW examples, this one from Tom Dykstra

- The Unit Of Work Manager should be New each Http request

- The context is NOT thread safe so make sure each thread has its own context.

- Let EF cache things behind the scenes.

- Test Context creation times. after several Http request. Do you still have a concern?

- Expect problems if you store the context in static. any sort of concurrent access will hurt and if you are using parallel AJAX calls, assume 90+% chance of problems if using a static single context.

For some performance tips, well worth a read

Problem

I have a project on MVC. We chose EF for our DB transactions. We created some managers for the BLL layer. I found a lot of examples, where "`using`" statement is used, i.e. ``` public Item GetItem(long itemId) { using (var db = new MyEntities()) { return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); } } ``` Here we create a new instance of DBcontext `MyEntities()`. We using "`using`" in order to "ensure the correct use of IDisposable objects." It's only one method in my manager. But I have more than ten of them. Every time I call any method from the manager I'll be using "`using`" statement and create another DBcontext in the memory. When will the garbage collector (GC) dispose them? Does anyone know? But there is alternative usage of the manager methods. We create a global variable: ``` private readonly MyEntities db = new MyEntities(); ``` and use DBcontext in every method without "`using`" statement. And method looks like this: ``` public Item GetItem(long itemId) { return db.Items.Where(it => it.ItemId == itemId && !it.IsDeleted).FirstOrDefault(); } ``` Questions: - What is the proper way of using DBcontext variable? - What if we wouldn't use "`usage`" statement (because it affects the performance) - GC will do all for that? I'm a "rookie" in EF usage and still haven't found the unequivocal answer for this question.

Original source