EF基类封装

1、MyDbContext

public partial class MyDbContext: DbContext
    {
        public MyDbContext()
            : base("name=MyEntities")
        {
        }
        public virtual DbSet<user> user{ get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
}

2、MyDbContextFactory

  public class MyDbContextFactory
    {
        /// <summary>
        /// 获取线程唯一上下文
        /// </summary>
        /// <returns></returns>
        public static MyDbContext GetCurrentDbContext()
        {
            //线程在内存上下文
            TaosDbContext myDbContext = CallContext.GetData("MyCurrentDbContext") as MyDbContext;

            if (myDbContext== null)
            {
                myDbContext= new MyDbContext();
                CallContext.SetData("MyCurrentDbContext", myDbContext);
            }
            return myDbContext;
        }
    }

  

 

3、GenericRepository

    public class GenericRepository<TEntity> where TEntity : class
    {
        public MyDbContext context { get; private set; }
        public DbSet<TEntity> dbSet { get; private set; }
        public GenericRepository()
        {
            this.context = MyDbContextFactory.GetCurrentDbContext();
            this.dbSet = context.Set<TEntity>();
        }

        public void SaveChanges()
        {
            if (this.context != null)
            {
                this.context.SaveChanges();
            }
        }

        private DbContextTransaction beginTransaction;
        public void BeginTransaction()
        {
            this.beginTransaction = context.Database.BeginTransaction();
        }

        public void Commit()
        {
            if (this.beginTransaction == null)
                return;

            try
            {
                this.SaveChanges();
                this.beginTransaction.Commit();
            }
            catch (Exception ex)
            {
                if (this.beginTransaction != null)
                    this.beginTransaction.Rollback();
                throw;
            }
            finally
            {
                if (this.beginTransaction != null)
                    this.beginTransaction.Dispose();
                this.beginTransaction = null;
            }
        }

        #region EF 增删改查 

        /// <summary>
        /// 插入
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public TEntity Insert(TEntity entity)
        {
            this.dbSet.Add(entity);
            return entity;
        }

        /// <summary>
        /// 批量插入
        /// </summary>
        /// <param name="entitys"></param>
        /// <returns></returns>
        public IEnumerable<TEntity> InsertRange(IEnumerable<TEntity> entitys)
        {
            this.dbSet.AddRange(entitys);
            return entitys;
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public void Delete(TEntity entity)
        {
            context.Entry<TEntity>(entity).State = EntityState.Deleted;
        }

        /// <summary>
        /// 删除 根据条件删除
        /// </summary>
        /// <param name="whereExpression"></param>
        public void Delete(Expression<Func<TEntity, bool>> whereExpression)
        {
            var entity = this.dbSet.Where(whereExpression).FirstOrDefault();
            if (entity != null)
            {
                Delete(entity);
            }
        }

        /// <summary>
        /// 批量删除
        /// </summary>
        /// <param name="entitys"></param>
        /// <returns></returns>
        public void DeleteRange(IEnumerable<TEntity> entitys)
        {
            this.dbSet.RemoveRange(entitys);
        }

        /// <summary>
        /// 批量删除 根据条件删除
        /// </summary>
        /// <param name="entitys"></param>
        /// <returns></returns>
        public void DeleteRange(Expression<Func<TEntity, bool>> whereExpression)
        {
            var entitys = this.dbSet.Where(whereExpression);
            if (entitys != null)
            {
                DeleteRange(entitys);
            }
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public void Update(TEntity entity)
        {
            this.dbSet.Attach(entity);
            context.Entry(entity).State = EntityState.Modified;
        }
        /// <summary>
        /// 批量更新
        /// </summary>
        /// <param name="entitys"></param>
        /// <returns></returns>
        public IEnumerable<TEntity> Update(IEnumerable<TEntity> entitys)
        {
            foreach (var entity in entitys)
            {
                Update(entity);
            }
            return entitys;
        }

        /// <summary>
        /// 单表分页
        /// </summary>
        /// <param name="PageIndex"></param>
        /// <param name="PageSize"></param>
        /// <param name="TotalCount"></param>
        /// <param name="whereExpression"></param>
        /// <param name="whereOrderBy"></param>
        /// <returns></returns>
        public List<TEntity> Pagination(int PageIndex, int PageSize, out int TotalCount, Expression<Func<TEntity, bool>> whereExpression, Expression<Func<TEntity, bool>> whereOrderBy = null)
        {
            var querys = this.dbSet.Where(whereExpression);
            if (whereOrderBy != null)
            {
                querys = querys.OrderByDescending(whereOrderBy);
            }
            TotalCount = querys.Count();
            return querys.Skip(PageSize * (PageIndex - 1)).Take(PageSize).ToList() ?? null;
        }
        #endregion
    }

  

原文地址:https://www.cnblogs.com/lizhenhong/p/12175280.html

时间: 2024-10-05 23:27:16

EF基类封装的相关文章

Android 开发技巧 - Android 6.0 以上权限大坑和权限检查基类封装

简单介绍 关于运行时权限的说法,早在Google发布android 6.0的时候,大家也听得蛮多的.从用户的角度来讲,用户是受益方,更好的保护用户的意思,而对于开发者来说,无疑增加了工作量. 对于6.0以下的权限在安装时,会根据权限声明产生一个权限列表,用户只有同意才能完成app的安装.而在6.0以后,不需要先对权限授权就可以安装app,对于权限的授权我们可以选择禁止. 在新的权限机制中,Google将权限分为两类: Normal Permissions(普通权限):不涉及用户隐私,不需要用户进

微信公众号发送消息之发送客服消息基类封装

当用户主动发消息给公众号的时候(包括发送信息.点击自定义菜单.订阅事件.扫描二维码事件.支付成功事件.用户维权),微信将会把消息数据推送给开发者,开发者在一段时间内(目前修改为48小时)可以调用客服消息接口,通过POST一个JSON数据包来发送消息给普通用户,在48小时内不限制发送次数.此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务. http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/custom/

EF增删查改基类

/// <summary> /// EF DAL CURD基类 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDAL<T> where T : class, new() { /// <summary> /// 上下文网关 /// </summary> protected SchoolEntities db = n

微信公众号开发系列-Http请求封装基类

HttpHelper请求封装基类,支持get请求和POS请求,方便微信开发接口交互,为后面接口交互做准备. 1.HttpHelper帮助基类 [csharp] view plaincopy using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Net; using System.Net.Security; namespa

EF实体框架数据操作基类(转)

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Data.Entity.Infrastruct

EF实体框架数据操作基类

//----------------------------------------------------------------// Copyright (C) 2013 河南禄恒软件科技有限公司// // 功能描述:实体框架数据仓储的操作接口,包含增删改查接口////----------------------------------------------------------------using System;using System.Data.Entity.Infrastruct

BIM工程信息管理系统-EF实体框架数据操作基类

EF实体框架数据操作基类主要是规范增.改.查.分页.Lambda表达式条件处理,以及异步操作等特性,这样能够尽可能的符合基类这个特殊类的定义,实现功能接口的最大化重用和统一. 1.程序代码 /// <summary> /// MSSQL数据库 数据层的父类 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDAL<T> where T :

框架搭建与EF常用基类实现

前两篇简单谈了一些.Net Core的优势以及机构设计的一些思路,这一篇开始,我们将从零开始搭建架构,底层我们将采用EF来访问数据库,所以这篇我们将贴一下EF常用操作的基类. 简单介绍下一些类库将要实现的功能: Business:业务实现层 Domains:实体(Model) Service:接口 Data:数据库访问(EF或其他) EasyCacheing:开源缓存管理 Tools:工具类库 其他的我们用到的时候再说: 接着说EF常用操作基类,我们将基类放在Data下,具体目录结构如下: Ba

Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)

本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试,那么建立单元测试就有很大的必要,本篇主要介绍如何利用VS创建内置的单元测试项目进行实体框架的基类接口测试. 在采用单元测试这个事情上,很多人可能想到了NUnit单元测试工具和NMock工具进行处理,其实微软VS里面也已经为我们提供了类似的单元测试工具了,可以不需要使用这个第三方的单元测试工具,经试