注:EFCore和EF有区别,在core中写的也有一点区别,每个人写法不同仅供参考
写的比较细致耐性一点看完会有收获的
首先加上必要的引用
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Infrastructure;
然后在自己创建好的类文件里面写
namespace MS.Services.Data { public class MSDb : DbContext //引用DbContext { public MSDb(DbContextOptions<MSDb> options) : base(options)//传到基层,类似为实例化一下可写可不写 { } DbSet<TEntity>可用于查询和保存的实例 TEntity 。 针对的 LINQ 查询 DbSet<TEntity> 将转换为针对数据库的查询 public virtual DbSet<User> Users { get; set; }//跟写实体类一样定义几个和数据库交互的字段 public virtual DbSet<Enterprise> Enterprises { get; set; } } }
第二步调用上面的MSDb,我这里是换了一个类写的
namespace MS.Services.Data { public class Model { protected MSDb DbContext { get; private set; } public Model(CertMSDb dbContext) { DbContext = dbContext; } } }
第三步加点关键性的方法
namespace MS.Services.Data { public class Model { protected MSDb DbContext { get; private set; } public Model(CertMSDb dbContext) { DbContext = dbContext; } 这是基本的保存更改,你进行处理的数据处理的是取出来在程序里面的,需要保存更改才能真正修改数据库数据 public void SaveChanges() { DbContext.SaveChanges(); } 目前考虑高并发基本都是用异步保存更改的,这个用的是最多的 public async Task SaveChangesAsync() { await DbContext.SaveChangesAsync(); } } }
还有就是这个当然有直接的增删改查,但是直接存会有很多问题比如:1.当很多条数据在不同的表里面的时候那就需要一条一条每个表存一次,2.当高并发的时候处理数据的时候,A才存了一半,而B覆盖了A的一半,这个时候A又覆盖了B的前一半乱了的问题,3.处理速度问题
必要的时候也用这种
public virtual async Task<T> AddCoreAsync<T>(T model) { return DbContext.Add<T>(model).Entity; } public virtual IQueryable<T> Query<T>() { return DbContext.Set<T>(); }
最终呈现的就是下面的样子
namespace MS.Services.Data { public class Model { protected MSDb DbContext { get; private set; } public Model(CertMSDb dbContext) { DbContext = dbContext; } public void SaveChanges() { DbContext.SaveChanges(); } public async Task SaveChangesAsync() { await DbContext.SaveChangesAsync(); } public virtual async Task<T> AddCoreAsync<T>(T model) { return DbContext.Add<T>(model).Entity; } public virtual IQueryable<T> Query<T>() { return DbContext.Set<T>(); } } }
最后一步就是使用了 ,注意我换了一个文件定义,不建议写一起,改起来不方便
定义一下,方便到处使用
namespace MS.Services { 引用写好的EF处理的类传入我要自己的实体类 public class UserService : Model<User> { //实例化一下,免得后面还要进行处理 public UserService(MSDb dbContext) : base(dbContext) { } } }
接下来就是使用阶段,怎么使用我们定义好的,上面定义好了不需要第二次处理
namespace MS.WebApi.Controllers { public class UserController { 调用上面我们处理好了的类直接使用就可以了 private readonly UserService _userService; public UserController(UserService userService) { _userService = userService;//日常实例一下 } public async Task<IActionResult> List(LoginDto dto) { 使用就是这样使用,默认查询到所有数据,没有筛选 var result = await _userService.Query(); } } }
如果加条件的话可以使用PredicateBuilder进行筛选,条件判断 需要了解PredicateBuilder相关点下方链接
public async Task<IActionResult> List(Model filter) { var express = PredicateBuilder.New<Result>() .And(x => x.Id == filter.Id) .And(x => x.Title==filter.Title); var result = await _userService.Query(express); // 或者不习惯可以用 var result = await _userService.Query().where(express); }
PredicateBuilder详细讲解使用方法:https://www.cnblogs.com/liaote/p/15411845.html
希望上述能帮到你