zoukankan      html  css  js  c++  java
  • Entity Framework 第一篇

    这段时间研究了orm框架EF 写一写研究的历程和心得

    先贴上核心代码

     public interface ITransaction
        {
            bool IsTransaction { get;}  
    
            void BeginTransaction();
    
            int Commit();
    
            void Rollback();
        }
     public class BaseRepository : ITransaction, IDisposable
        {
    
            private XFDbContext dbContext;
    
            /// <summary>
            /// 连接字符串名称
            /// </summary>
            public string ConnectionName { get; set; }
    
            private bool disposed;
    
            public BaseRepository()
            {
                this.dbContext = new XFDbContext();
                this.IsTransaction = false;
            }
    
            public BaseRepository(string connectionName)
            {
                this.ConnectionName = connectionName;
                this.dbContext = new XFDbContext(ConnectionName);
                this.IsTransaction = false;
            }
    
            #region 增删改
    
            /// <summary>
            /// 新增实体对象
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="model"></param>
            /// <returns></returns>
            public int Insert<TEntity>(TEntity model) where TEntity : class
            {
                return this.ChangeObjectState<TEntity>(model, EntityState.Added);
            }
    
            /// <summary>
            /// 新增实体对象集合
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="models"></param>
            /// <returns></returns>
            public int Insert<TEntity>(IEnumerable<TEntity> models) where TEntity : class
            {
                return this.ChangeObjectState<TEntity>(models, EntityState.Added);
            }
    
            /// <summary>
            /// 持久化对象更改
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="model"></param>
            /// <returns></returns>
            public int Update<TEntity>(TEntity model) where TEntity : class
            {
                return this.ChangeObjectState<TEntity>(model, EntityState.Modified);
            }
    
            /// <summary>
            /// 更新对象集合
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="models"></param>
            /// <returns></returns>
            public int Update<TEntity>(IEnumerable<TEntity> models) where TEntity : class
            {
                return this.ChangeObjectState<TEntity>(models, EntityState.Modified);
            }
    
            /// <summary>
            /// 更新对象部分属性
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="predicate"></param>
            /// <param name="updateAction"></param>
            /// <returns></returns>
            public int Update<TEntity>(Expression<Func<TEntity, bool>> predicate, Action<TEntity> updateAction) where TEntity : class
            {
                if (predicate == null)
                    throw new ArgumentNullException("predicate");
                if (updateAction == null)
                    throw new ArgumentNullException("updateAction");
    
                //dbContext.Configuration.AutoDetectChangesEnabled = true;
                var _model = dbContext.Set<TEntity>().Where(predicate).ToList();
                if (_model == null) return 0;
                _model.ForEach(p =>
                {
                    updateAction(p);
                    dbContext.Entry<TEntity>(p).State = EntityState.Modified;
                });
                return Save();
            }
    
            /// <summary>
            /// 删除实体对象
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="model"></param>
            /// <returns></returns>
            public int Delete<TEntity>(TEntity model) where TEntity : class
            {
                return this.ChangeObjectState<TEntity>(model, EntityState.Deleted);
            }
    
            /// <summary>
            /// 删除实体对象集合
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="models"></param>
            /// <returns></returns>
            public int Delete<TEntity>(IEnumerable<TEntity> models) where TEntity : class
            {
                return this.ChangeObjectState<TEntity>(models, EntityState.Deleted);
            }
    
            /// <summary>
            /// 删除实体对象集合(符合部分条件的)
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="predicate"></param>
            /// <returns></returns>
            public int Delete<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
            {
                List<TEntity> _list = null;
    
                _list = dbContext.Set<TEntity>().Where(predicate).ToList();
                foreach (var item in _list)
                {
                    dbContext.Entry<TEntity>(item).State = EntityState.Deleted;
                }
                return Save();
            }
    
            #endregion 增删改
    
            #region 查询
            public IList<TEntity> Search<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : class
            {
                if (predicate == null)
                {
                    return dbContext.Set<TEntity>().ToList();
                }
                else
                {
                    return dbContext.Set<TEntity>().Where(predicate).ToList();
                }
    
            }
    
            /// <summary>
            /// 查询单个记录
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="predicate"></param>
            /// <returns></returns>
            public TEntity SearchFirstOrDefault<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : class
            {
                if (predicate == null)
                {
                    return dbContext.Set<TEntity>().FirstOrDefault();
                }
                else
                {
                    return dbContext.Set<TEntity>().Where(predicate).FirstOrDefault();
                }
    
            }
    
            /// <summary>
            /// 查询多笔记录
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="predicate"></param>
            /// <returns></returns>
            public IList<TEntity> SearchList<TEntity>(Expression<Func<TEntity, bool>> predicate = null) where TEntity : class
            {
    
                if (predicate == null)
                {
                    return dbContext.Set<TEntity>().ToList();
                }
                else
                {
                    return dbContext.Set<TEntity>().Where(predicate).ToList();
                }
            }
    
            public IList<TEntity> GetPaged<TEntity>(out int total, Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, int index = 1, int size = 20) where TEntity : class
            {
                int skipCount = (index - 1) * size;
                var query = Get(filter, orderBy);
                total = query.Count();
                query = skipCount > 0 ? query.Skip(skipCount).Take(size) : query.Take(size);
                return query.ToList();
            }
    
            public IList<TEntity> GetPaged<TEntity>(out int total, Expression<Func<TEntity, bool>> filter = null, string orderBy = null, int index = 1, int size = 20) where TEntity : class
            {
                int skipCount = (index - 1) * size;
                var query = Get(filter, orderBy);
                total = query.Count();
                query = skipCount > 0 ? query.Skip(skipCount).Take(size) : query.Take(size);
                return query.ToList();
            }
    
            public IQueryable<TEntity> Get<TEntity>(Expression<Func<TEntity, bool>> filter = null, string orderBy = null) where TEntity : class
            {
                IQueryable<TEntity> query = dbContext.Set<TEntity>();
                if (filter != null)
                {
                    query = query.Where(filter);
                }
                if (!string.IsNullOrEmpty(orderBy))
                {
                    query = query.OrderBy(orderBy);
                }
                return query.AsQueryable();
            }
    
            public IQueryable<TEntity> Get<TEntity>(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null) where TEntity : class
            {
                IQueryable<TEntity> query = dbContext.Set<TEntity>();
                if (filter != null)
                {
                    query = query.Where(filter);
                }
                if (orderBy != null)
                {
                    orderBy(query).AsQueryable();
                }
                return query.AsQueryable();
            }
    
    
            #endregion
    
            #region 私有方法
    
    
            private int Save()
            {
                int effect = 0;
                if (!this.IsTransaction)
                {
                    effect = dbContext.SaveChanges();
                }
                return effect;
            }
    
    
            /// <summary>
            /// 变更上下文管理器(对象)
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="model"></param>
            /// <param name="state"></param>
            private int ChangeObjectState<TEntity>(TEntity model, EntityState state) where TEntity : class
            {
                //_context.Configuration.ValidateOnSaveEnabled = false; 
                dbContext.Entry<TEntity>(model).State = state;
                return Save();
    
            }
    
            /// <summary>
            /// 变更上下文管理器(对象集合)
            /// </summary>
            /// <typeparam name="TEntity"></typeparam>
            /// <param name="model"></param>
            /// <param name="state"></param>
            private int ChangeObjectState<TEntity>(IEnumerable<TEntity> model, EntityState state) where TEntity : class
            {
                if (model == null) return 0;
    
                //_context.Configuration.AutoDetectChangesEnabled = false;
                model.ToList().ForEach(p => dbContext.Entry<TEntity>(p).State = state);
                return Save();
    
            }
    
    
            #endregion
    
            /// <summary>
            /// 执行带参数的sql语句,返回List
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="strsql"></param>
            /// <param name="paras"></param>
            /// <returns></returns>
            public IEnumerable<T> GetList<T>(string strsql, SqlParameter[] paras)
            {
                return dbContext.Database.SqlQuery<T>(strsql, paras).ToList();
            }
    
            /// <summary>
            /// 执行不带参数的sql语句,返回list
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="strsql"></param>
            /// <returns></returns>
            public IEnumerable<T> GetList<T>(string strsql)
            {
                return dbContext.Database.SqlQuery<T>(strsql).ToList();
            }
    
            /// <summary>
            ///  执行带参数的sql语句,返回一个对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="strsql"></param>
            /// <param name="paras"></param>
            /// <returns></returns>
            public T GetOneEntity<T>(string strsql, SqlParameter[] paras)
            {
                return dbContext.Database.SqlQuery<T>(strsql, paras).Cast<T>().First();
            }
    
            /// <summary>
            ///  执行不带参数的sql语句,返回一个对象
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="strsql"></param>
            /// <returns></returns>
            public T GetOneEntity<T>(string strsql)
            {
                return dbContext.Database.SqlQuery<T>(strsql).Cast<T>().First();
            }
    
            public int ExecuteSqlCommand(string sql, params SqlParameter[] paras)
            {
                if (this.IsTransaction)
                {
                    if (dbContext.Database.CurrentTransaction == null)
                    {
                        dbContext.Database.BeginTransaction();
                    }
                }
                return dbContext.Database.ExecuteSqlCommand(sql, paras);
            }
    
    
            /// <summary>
            /// 获取查询数量
            /// </summary>
            /// <param name="sql"></param>
            /// <param name="paras"></param>
            /// <returns></returns>
            public int GetCount(string sql, SqlParameter[] paras)
            {
                return dbContext.Database.SqlQuery(typeof(int), sql, paras).Cast<int>().First();
            }
    
            public void BeginTransaction()
            {
                this.IsTransaction = true;
    
            }
    
            public int Commit()
            {
                int reault = dbContext.SaveChanges();
                this.IsTransaction = false;
                DbContextTransaction transaction = dbContext.Database.CurrentTransaction;
                if (transaction != null)
                {
                    transaction.Commit();
                    transaction.Dispose();
                    reault += 1;
                }
    
                return reault;
            }
    
            public void Rollback()
            {
                this.IsTransaction = false;
                DbContextTransaction transaction = dbContext.Database.CurrentTransaction;
                if (transaction != null)
                {
                    transaction.Rollback();
                    transaction.Dispose();
                }
    
            }
    
            public bool IsTransaction
            {
                get;
                private set;
            }
    
            public void Dispose()
            {
                this.Dispose(true);
                GC.SuppressFinalize(this);
            }
    
            public virtual void Dispose(bool disposing)
            {
                if (!this.disposed)
                {
                    if (disposing)
                    {
                        this.dbContext.Dispose();
                    }
                }
                this.disposed = true;
            }
        }
  • 相关阅读:
    树形结构菜单,递归实现
    基于Vue的日历组件,可以标注重要日子
    关于element-ui级联菜单(城市三级联动菜单)和回显问题
    继承(面试问到)
    vue监听浏览器刷新
    Popover 弹出框,里面的表格点击后关闭弹窗
    el-table表格合并单元格
    对角线
    ElementUI中el-radio再次点击取消选中
    保留文本框换行和空格
  • 原文地址:https://www.cnblogs.com/njcxwz/p/5581258.html
Copyright © 2011-2022 走看看