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();
            }
        }

        #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;
        }
    }
时间: 2024-08-07 17:01:26

Entity Framework 第一篇的相关文章

实体框架- Entity Framework 基础篇

以前写数据层D层的时候里面有好多的SQL语句,如何省略到繁琐的SQL语句,微软提供了一种很好的方式-实体框架-Entity Framwork.一种对象映射机制,支持.NET开发人员使用域特定对象来出来关系数据,消除了对开发人员通常需要编写的大部分数据访问代码的需求. ADO.NET Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案.实体框架Entity Framework是ADO.NET中的一组支持开发面向数据的软件

Entity Framework的启动速度优化

刚开始的时候没有太在意,但是随着系统的发布,这种初次请求,或者闲置若干时间后第一次请求的漫长等待使得App的体验很差,很多时候App加载好半天数据都没过来.如果前端没处理好,还会导致App的假死.所以就花了点功夫研究下什么原因导致. 刚开始的时候,还以为是WebService的框架出了问题.后面使用App,通过Fiddler看到了,某次请求db.竟然长达6s中,并且每次导致请求超时都出现在db.访问这一块,这显然不正常.早期,我们访问数据库使用的是原始的ADO.NET 执行SQL语句,如果有参数

Entity Framework 4 第一篇 POCO

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Entity Framework 4 第一篇 POCO 在EFv1版本中,并没有提供对POCO(Plain Old CLR Objects)的支持.目前,在.Net4.0 Beta2中的EF 4完善了很多.可以预见,正式的EF4版本应该会有很多

第一篇 Entity Framework Plus 之 Audit

一般系统会有登陆日志,操作日志,异常日志,已经满足大部分的需求了.但是有时候,还是需要Audit 审计日志,审计日志,主要针对数据增,改,删操作数据变化的记录,主要是对数据变化的一个追踪过程.其中主要追踪数据关键点如下 1. 新增 具体新增哪些数据,值是什么,新增人谁. 2. 修改 具体修改哪些数据,之前值是什么,修改后值是什么,修改人谁. 3. 删除 具体删除哪些数据,之前值是什么,删除人谁. 有了这个Audit追踪过程,当那天,用户操作的数据出现问题,你就可以根据这个Audit将数据恢复到某

第一篇:Entity Framework 简介

先从ORM说起吧,很多年前,由于.NET的开源组件不像现在这样发达,更别说一个开源的ORM框架,出于项目需要,以及当时OOP兴起(总不至于,在项目里面全是SQL语句),就自己开始写ORM框架.要开发ORM框架首先要了解ORM概念. ORM 对象关系映射,O(Object) 对象,在项目中就是实体,更加精确的来说就是数据Model,也可以说持久化类.R(Relation) 关系数据,M (Mapping)映射,将对象映射到关系数据,将关系数据映射到对象的过程. 更加直观理解就是,ORM 就是以OO

《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! 我学习EF的原因主要是: a.EF是微软推荐的数据库访问技术: b.能提高我的开发效率,我不喜欢写那密密麻麻的SQL: c.比我写的SQL更合理,更快.目前EF生成的SQL的质量已经很高了.你比较熟悉SQL的话,那它在速度上肯定比不上你,新手的话就别跟我争快慢了,能写一像样的SQL就不错了.至少我

第二篇:Entity Framework CodeFirst &amp; Model 映射

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 前一篇 第一篇:Entity Framework 简介 我有讲到,ORM 最关键的 Mapping,也提到了最早实现Mapping的技术,就是 特性 + 反射,那Entity Framework 实现Mapping 又是怎样的呢? Entity

Entity Framework学习中级篇

1-EF支持复杂类型的实现 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和LastName字段,那么对应的Customer实体类将会有FristName和LastName这两个属性.当我们想把FirstName和LastName合成一个名为CustomerName属性时,此时,如果要在EF中实现这个目的,那么我们就需要用到复杂类型. 目前,由于EF不

第二篇 Entity Framework Plus 之 Query Future

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 从性能的角度出发,能够减少 增,删,改,查,跟数据库打交道次数,肯定是对性能会有所提升的(这里单纯是数据库部分). 今天主要怎样减少Entity Framework查询跟数据库打交道的次数,来提高查询性能. 举一个大家最常用功能 "分页&quo