Efcore对接金仓数据库KingbaseES

什么是KingbaseES

人大金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES)是北京人大金仓信息技术股份有限公司在国家“863”计划数据库重大专项和北京市科技计划重大项目支持下研发成功的具有自主知识产权的国产大型通用数据库管理系统(DBMS)。系统具有完整的大型通用数据库管理系统特征,提供完备的数据库管理功能,支持1000个以上并发用户、TB级数据量、GB级大对象。系统可运行于Windows、Linux、麒麟以及UNIX等多种操作系统平台,具有标准通用、稳定高效、安全可靠、兼容易用等特点。.

什么是EF Core

Entity Framework Core (EF Core) 是在 2016 年首次发布的 EF6的完全重写。 它附带于 Nuget包中,是 Microsoft.EntityFrameworkCore 的主要组成部分。 EF Core 是一种跨平台产品,可以在 .NET Core 或 .NET Framework 上运行。

EF Core支持多个数据库引擎,包括KingbaseES。为了支持EF core,KingbaseES提供了Kdbndp.EntityFrameworkCore.KingbaseES。

代码集成

1、下载官方的驱动

Efcore对接金仓数据库KingbaseES

2、项目中对dll进行引用

3、在Services进行上下文注入

builder.Services.AddDbContext<WpsLogContext>(
       options => options.EnableSensitiveDataLogging(true).UseLoggerFactory(MyLoggerFactory).UseKdbndp(builder.Configuration.GetSection("ConnectionStrings:wpslogDefaultConnection").Value));

4、对数据库访问进行封装

  /// <summary>
        /// 添加
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public bool Add(T entity)
        {
            context.Set<T>().Add(entity);
            return context.SaveChanges() > 0;
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public bool Delete(T entity)
        {
            context.Set<T>().Remove(entity);
            return context.SaveChanges() > 0;
        }

        /// <summary>
        /// 根据主键查询
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public T Find(int id)
        {
            return context.Set<T>().Find(id);
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public bool Update(T entity)
        {
            var entry = context.Entry(entity);
            entry.State = EntityState.Modified;
            //如果数据没有发生变化
            if (!this.context.ChangeTracker.HasChanges())
            {
                return false;
            }
            return context.SaveChanges() > 0;
        }

        /// <summary>
        /// 查询
        /// </summary>
        /// <returns></returns>
        public IQueryable<T> Query()
        {
            return context.Set<T>();
        }

        /// <summary>
        /// 查询且不被上下文所跟踪
        /// </summary>
        /// <returns></returns>
        public IQueryable<T> QueryAsNoTracking()
        {
            return context.Set<T>().AsNoTracking();
        }

        public int Update(Expression<Func<T, bool>> whereLambda, Expression<Func<T, T>> entity)
        {
            throw new Exception();
            //return context.Set<T>().Where(whereLambda).Update(entity);
        }

        public int Delete(Expression<Func<T, bool>> whereLambda)
        {
            throw new Exception();
            //return context.Set<T>().Where(whereLambda).Delete();
        }

        public bool IsExist(Expression<Func<T, bool>> whereLambda)
        {
            return context.Set<T>().Any(whereLambda);
        }

        public T GetEntity(Expression<Func<T, bool>> whereLambda)
        {
            return context.Set<T>().AsNoTracking().FirstOrDefault(whereLambda);
        }

        public Tuple<List<T>, int> Select<S>(int pageSize, int pageIndex, Expression<Func<T, bool>> whereLambda, Expression<Func<T, S>> orderByLambda, bool isAsc)
        {
            var total = context.Set<T>().Where(whereLambda).Count();

            if (isAsc)
            {
                var entities = context.Set<T>().Where(whereLambda)
                                      .OrderBy<T, S>(orderByLambda)
                                      .Skip(pageSize * (pageIndex - 1))
                                      .Take(pageSize).ToList();

                return new Tuple<List<T>, int>(entities, total);
            }
            else
            {
                var entities = context.Set<T>().Where(whereLambda)
                                      .OrderByDescending<T, S>(orderByLambda)
                                      .Skip(pageSize * (pageIndex - 1))
                                      .Take(pageSize).ToList();

                return new Tuple<List<T>, int>(entities, total);
            }
        }

        public virtual void Dispose()
        {
            if (context != null)
            {
                context.Dispose();
            }
        }

至此,接入完成,当然中间有些坑,需要自己去研究,这边就不详细描述了。