EFCore通用仓储类

cs 复制代码
using Microsoft.EntityFrameworkCore;
using SmarkParking.Server.IService;
using SmartParking.Server.IEFContext;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace SmarkParking.Server.Service
{
    public class ServiceBase : IServiceBase
    {

        protected DbContext Context { get; private set; }
        public ServiceBase(IEFContext eFContext)
        {
            Context = eFContext.CreateDBContext();
        }

        public void Commit()
        {
            this.Context.SaveChanges(); // 直接保存就行了
        }

        public void Delete<T>(int Id) where T : class
        {
            T t = this.Find<T>(Id);
            if (t == null) throw new Exception("t is null");    // 如果是空就报错
            this.Context.Set<T>().Remove(t);    // 删除这个
            this.Commit();  // 删完提交
        }

        public void Delete<T>(T t) where T : class
        {
            if (t == null) throw new Exception("t is null");    // 如果是空就报错
            this.Context.Set<T>().Attach(t);    // 尊卑删除这个实体
            this.Context.Set<T>().Remove(t);    // 删除这个
            this.Commit();  // 删完提交
        }

        public void Delete<T>(IEnumerable<T> tList) where T : class
        {
            // 将要删除的实体标记上
            foreach (var t in tList)
            {
                this.Context.Set<T>().Attach(t);    // 要删除这个实体
            }
            this.Context.Set<T>().RemoveRange(tList);    // 删除这个集合
            this.Commit();  // 删完提交
        }

        public T Find<T>(int id) where T : class
        {
            return this.Context.Set<T>().Find(id);
        }

        public T Insert<T>(T t) where T : class
        {
            this.Context.Set<T>().Add(t);   // 添加
            this.Commit();  // 提交
            return t;
        }

        public IEnumerable<T> Insert<T>(IEnumerable<T> tList) where T : class
        {
            this.Context.Set<T>().AddRange(tList);  
            this.Commit();  //
            return tList;
        }

        public IQueryable<T> Query<T>(Expression<Func<T, bool>> funcWhere) where T : class
        {
            return this.Context.Set<T>().Where<T>(funcWhere);
        }

        public void Update<T>(T t) where T : class
        {
            if (t == null) throw new Exception("t is null");

            this.Context.Set<T>().Attach(t);    // 跟踪实体
            this.Context.Entry<T>(t).State = EntityState.Modified;  // 标记为已修改
            this.Commit();
        }

        public void Update<T>(IEnumerable<T> tList) where T : class
        {
            // 跟踪和标记更改
            foreach (var t in tList)
            {
                this.Context.Set<T>().Attach(t);
                this.Context.Entry<T>(t).State = EntityState.Modified;
            }
            this.Commit();
        }

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

使用举例子

var users = _loginService.Query<SysUserInfo>(u => u.UserName == username && u.Password == pwd); // 他是Func<T, bool>类型做委托

相关推荐
炸炸鱼.1 小时前
PostgreSQL 日常维护速查手册
数据库·oracle
武藤一雄1 小时前
C# 异常(Exception)处理避坑指南
windows·microsoft·c#·.net·.netcore·鲁棒性
014-code2 小时前
MySQL 常用业务 SQL
数据库·sql·mysql
知识分享小能手2 小时前
MongoDB入门学习教程,从入门到精通,MongoDB的选择片键 - 完整知识点(16)
数据库·学习·mongodb
知识分享小能手2 小时前
MongoDB入门学习教程,从入门到精通,MongoDB分片配置完全指南(15)
数据库·学习·mongodb
y = xⁿ2 小时前
【MySQL】数据库的脏读,不可重复读和幻读,覆盖索引是什么,索引类型有哪些
数据库·mysql
小冷coding2 小时前
【面试】结合项目整理的场景面试题,覆盖 Java 基础、锁、多线程、数据库、分布式锁 / 事务、消息中间件等核心维度
java·数据库·面试
kcuwu.2 小时前
Python 正则表达式从入门到实战
数据库·python·正则表达式
卓怡学长2 小时前
m319个人网站的设计与实现
java·数据库·spring·tomcat·maven·intellij-idea