c# - Entity Framework dbcontext opening and closing and multiple calls -


i have decided implement genericrepository. realize there "best practices" , many many ways of doing this. know ioc container recommended , unit of work.

however, instead of getting told "you doing wrong"

  1. i want make sure code not causing unnecessary open connections
  2. i wish have handle on open /close of dbcontext

my genericrepository might tightly coupled dbcontext, not sure. using reverse poco generator, added in generic repository.

here 4 ways code "works"

1. new up

this news genericrepository, unless i'm worked model entity of "academiclevel" , seems in homecontroller not idea, right?

var repository = new genericrepository<academiclevel>(); list<academiclevel> academic = repository.selectall().tolist(); 

2. using statement

using (var gr = new genericrepository<academiclevel>()) {     list<academiclevel> academic = gr.selectall().tolist(); } 

3. new dbcontext implementation using

using (var db = new interntrackingdbcontext()) {     var repository = new genericrepository<academiclevel>();     list<academiclevel> academic = repository.selectall().tolist(); } 

4. using newing direct context calls

using (var db = new interntrackingdbcontext()) {    var data = db.skills;    foreach (var item in data)    {        // console app testing        console.writeline(item.skillname + " , id = " + item.skillid);    } } 

so above, i'm sure critical thing show genericrepository

public class genericrepository<t> : igenericrepository<t>, idisposable t : class {      private readonly interntrackingdbcontext db;     private dbset<t> table = null;      public genericrepository()     {          this.db = new interntrackingdbcontext();         table = db.set<t>();     }       public genericrepository(interntrackingdbcontext db)     {         this.db = db;         table = db.set<t>();     }      public ienumerable<t> selectall()     {         return table.tolist();     }      public t selectbyid(object id)     {         return table.find(id);     }      public void insert(t obj)     {         table.add(obj);     }      public void update(t obj)     {         table.attach(obj);         db.entry(obj).state = entitystate.modified;     }      public void delete(object id)     {         t existing = table.find(id);         table.remove(existing);     }      public void save()     {         db.savechanges();     }      protected virtual void dispose(bool disposing)     {         if (disposing)         {             if (db != null)             {                 db.dispose();             }         }     }     public void dispose()     {          dispose(true);         gc.suppressfinalize(this);     } } 

i not wish over-complicate this, make sure 1. approaching decently 2. calling crud methods best way possible 3. not keep dbcontext or connections open

ideally would want have homecontroller in said private @ top of page, i'm getting confused on interntrackingdbcontext , genericrepository far newing them up. see better way, code mods see can implemented?


Comments