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.