Asp.net Core使用EFCore+Linq進行操作


注: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

 

希望上述能幫到你

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM