Efcore对接金仓数据库KingbaseES

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、下载官方的驱动

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

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

以上是关于Efcore对接金仓数据库KingbaseES的主要内容,如果未能解决你的问题,请参考以下文章

人大金仓数据库的备份与还原 KingbaseES V8R6

人大金仓数据库的备份与还原 KingbaseES V8R6

金仓数据库约束怎么设置默认启用

炫“库”行动-人大金仓有奖征文,KingbaseES数据库经典排障记录

KingbaseES——人大金仓数据库安装教程

Linux 上安装 KingbaseES V8R6数据库(人大金仓)