实体框架dbcontext打开和关闭以及多次调用

时间:2016-08-08 17:41:28

标签: c# entity-framework repository repository-pattern

我决定实施 GenericRepository 。我意识到有“最佳实践”和许多方法可以做到这一点。我也知道会推荐IOC容器,甚至可能是一个工作单元。

但是,不要被告知“你做错了”

  1. 我想确保我的代码不会造成不必要的开放连接
  2. 我希望能够很好地处理dbcontext
  3. 的打开/关闭

    我的GenericRepository可能与dbcontext紧密耦合,不确定。 我正在使用反向poco生成器,但后来我添加了Generic Repository。

    以下是我的代码“工作”的四种方式

    1。新的

    这显然是GenericRepository的新闻,但除非我只使用“AcademicLevel”的模型实体,否则在HomeController中似乎这不是一个好主意,对吧?

    var repository = new GenericRepository<AcademicLevel>();
    List<AcademicLevel> academic = repository.SelectAll().ToList();
    

    2。使用声明

    using (var gr = new GenericRepository<AcademicLevel>())
    {
        List<AcademicLevel> academic = gr.SelectAll().ToList();
    }
    

    第3。使用

    创建新的dbcontext实现
    using (var db = new InternTrackingDbContext())
    {
        var repository = new GenericRepository<AcademicLevel>();
        List<AcademicLevel> academic = repository.SelectAll().ToList();
    }
    

    4。使用新的直接上下文调用

    using (var db = new InternTrackingDbContext())
    {
       var data = db.Skills;
       foreach (var item in data)
       {
           // console app for testing
           Console.WriteLine(item.SkillName + " , id = " + item.Skillid);
       }
    }
    

    因此,基于上述情况,我确定要展示的关键是我的 GenericRepository

    public class GenericRepository<T> : IGenericRepository<T>, IDisposable where 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);
        }
    }
    

    我不希望过度复杂化,但要确保 我正在接近这个 2.尽可能以最佳方式调用CRUD方法 3.不保持dbcontext或连接打开

    理想情况下我 WOULD 想要说一个HomeController,其中我在页面顶部说了一个私有,但我对 InternTrackingDbContext GenericRepository 就新事物而言。任何人都可以看到更好的方法,你看到的任何代码模型都可以轻松实现吗?

0 个答案:

没有答案