.net通用框架 (四)--DAL数据层以及数据接口

数据层以及数据接口设计如下图(以g_orga组织机构和g_role角色)为例,这几个类可以通过.tt模版生成

设计参考学习http://www.cnblogs.com/hanyinglong/archive/2013/04/08/3008896.html

技术分享

1.IBaseRepository

技术分享
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Data.Entity;
 6 using System.Linq.Expressions;
 7 
 8 namespace MISMODEL.DAL
 9 {
10     public interface IBaseRepository<T> where T : class, new()
11     {
12         void SetLazyLoading(bool flag);
13   
14         // 1实现对数据库的添加功能,添加实现EF框架的引用
15          bool AddEntity(T entity);
16          bool AddEntity(T entity,bool isSave);
17         // 2实现对数据库的修改功能
18         bool UpdateEntity(T entity);
19         // 3实现对数据库的删除功能
20         bool DeleteEntity(T entity);
21         bool DeleteEntity(List<T> entity, bool isSave);
22         // 4实现对数据库的查询  --主键查询
23         T FindByID(Expression<Func<T, bool>> whereLambda);
24         // 5实现对数据库的查询  --条件查询
25         IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda);
26         // 6实现对数据库的查询  --无条件查询
27         IQueryable<T> LoadEntities();
28         // 7查询返回dbset
29         DbSet<T> LoadDbSetEntities();
30         // 8实现对数据库的查询  --首行查询
31         T FirstOrDefaultEntities(Expression<Func<T, bool>> whereLambda);
32         // 9实现对数据库的查询   --动态条件查询
33         IQueryable<T> SqlQuery(string sqlstring, params object[] paramertes);
34         // 10实现对数据的分页查询
35         IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out int total, Expression<Func<T, bool>> whereLambda, bool isAsc, Func<T, S> orderByLambda);
36         //10事物提交
37         bool Commit();
38     }
39 }
View Code

2. BaseRepository<T>

技术分享
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Data.Entity;
  6 using System.Data.Entity.Infrastructure;
  7 using System.Data;
  8 using System.Linq.Expressions;
  9 
 10 
 11 namespace MISMODEL.DAL
 12 {
 13     public class BaseRepository<T> : IBaseRepository<T> where T : class ,new()
 14     {
 15         public MISDBEntities db = ContextFactory.GetCurrentContext();
 16         public void SetLazyLoading(bool flag)
 17         {
 18             db.Configuration.LazyLoadingEnabled = flag;
 19         }
 20        //1实现对数据库的增加功能
 21         public bool AddEntity(T entity)
 22         {
 23             db.Set<T>().Add(entity);
 24             return db.SaveChanges() > 0;
 25         }
 26         public bool AddEntity(T entity,bool isSave)
 27         {
 28             db.Set<T>().Add(entity);
 29             if (isSave)
 30             {
 31                 return db.SaveChanges() > 0;
 32             }
 33             else {
 34                 return false;
 35             }
 36          //   return isSave ? db.SaveChanges() > 0: false;
 37         }
 38        //2实现对数据库的编辑功能
 39        public bool UpdateEntity(T entity)
 40         {
 41                 db.Set<T>().Attach(entity);
 42                 db.Entry<T>(entity).State = EntityState.Modified;
 43 
 44                return db.SaveChanges() > 0;
 45          }
 46        //3实现对数据库的删除功能
 47        public bool DeleteEntity(T entity)
 48        {
 49            db.Set<T>().Attach(entity);
 50            db.Entry<T>(entity).State = EntityState.Deleted;
 51            return db.SaveChanges() > 0;
 52        }
 53        public bool DeleteEntity(List<T> entitys, bool isSave)
 54        {
 55            foreach (var T in entitys) {
 56                db.Set<T>().Attach(T);
 57                db.Entry<T>(T).State = EntityState.Deleted;
 58            }
 59            if (isSave)
 60            {
 61                return db.SaveChanges() > 0;
 62            }
 63            else
 64            {
 65                return false;
 66            }
 67        }
 68        public bool Commit() {
 69            return db.SaveChanges() > 0;
 70        }
 71        //4实现对数据库的查询  --主键查询
 72        public T FindByID(Expression<Func<T, bool>> whereLambda)
 73        {
 74            return db.Set<T>().AsNoTracking().FirstOrDefault(whereLambda);
 75        }
 76        //5实现对数据库的查询  --条件查询
 77        public IQueryable<T> LoadEntities(Expression<Func<T, bool>> whereLambda)
 78        {
 79            return db.Set<T>().AsNoTracking().Where<T>(whereLambda);
 80        }
 81        public DbSet<T> LoadDbSetEntities()
 82        {
 83            return db.Set<T>();
 84        }
 85        //6实现对数据库的查询  --无条件查询
 86        public IQueryable<T> LoadEntities()
 87        {
 88            return db.Set<T>().AsNoTracking().AsQueryable();
 89        }
 90        //7实现对数据库的查询  --首行查询
 91        public T FirstOrDefaultEntities(Expression<Func<T, bool>> whereLambda) 
 92        {
 93            return db.Set<T>().FirstOrDefault<T>(whereLambda);
 94        }
 95        //8实现对数据库的查询   --动态条件查询
 96        public IQueryable<T> SqlQuery(string sqlstring, params object[] paramertes)
 97        {
 98            return db.Database.SqlQuery<T>(sqlstring, paramertes).AsQueryable();
 99        }
100         //9实现对数据库的查询 --分页
101        public IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out  int total, Expression<Func<T, bool>> whereLambda, bool isAsc, Func<T, S> orderByLambda)
102        {
103            var temp = db.Set<T>().Where<T>(whereLambda);
104            total = temp.Count(); //得到总的条数
105            //排序,获取当前页的数据
106            if (isAsc)
107            {
108                temp = temp.OrderBy<T, S>(orderByLambda)
109                     .Skip<T>(pageSize * (pageIndex - 1)) //越过多少条
110                     .Take<T>(pageSize).AsQueryable(); //取出多少条
111            }
112            else
113            {
114                temp = temp.OrderByDescending<T, S>(orderByLambda)
115                    .Skip<T>(pageSize * (pageIndex - 1)) //越过多少条
116                    .Take<T>(pageSize).AsQueryable(); //取出多少条
117            }
118            return temp.AsQueryable();
119        }
120       }
121 }
View Code

3.角色和组织机构数据接口

技术分享
1     public interface IG_orgaRepository:IBaseRepository<G_orga> //生成接口
2     {
3     }
4  
5     public interface IG_roleRepository:IBaseRepository<G_role> //生成接口
6     {
7     }
View Code

4.角色和组织机构数据层实现

技术分享
    public class G_orgaRepository:BaseRepository<G_orga>,IG_orgaRepository //生成实体对象
    {
    }
    
    public class G_roleRepository:BaseRepository<G_role>,IG_roleRepository //生成实体对象
View Code

5.为实现数据线程唯一,新建类ContextFactory

BaseRepository<T>调用该类

 public MISDBEntities db = ContextFactory.GetCurrentContext();

技术分享
    public class ContextFactory
    {
        /// <summary>
        /// 获取当前数据上下文
        /// </summary>
        /// <returns></returns>
        public static MISDBEntities GetCurrentContext()
        {
            MISDBEntities _nContext = CallContext.GetData("MISDB") as MISDBEntities;
            if (_nContext == null)
            {
                _nContext = new MISDBEntities();
                CallContext.SetData("MISDB", _nContext);
            }
            _nContext.Configuration.LazyLoadingEnabled = false;
            return _nContext;
        }
    }
View Code

6.为降低系统耦合建立工厂类RepositoryFactory

技术分享
public static class RepositoryFactory
    {
  

        public static  IG_orgaRepository  G_orgaRepository
        {
            get { return new G_orgaRepository(); }
        }
        public static  IG_rolemenuRepository  G_rolemenuRepository
        {
            get { return new G_rolemenuRepository(); }
        }

    }
View Code

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。