.Net -- EF Core

来源:https://www.cnblogs.com/Liyuting/archive/2023/03/09/17198407.html
-Advertisement-
Play Games

1. EF Core簡介Entity Framework (EF) Core 是輕量化、可擴展、開源和跨平臺版的常用 Entity Framework 數據訪問技術。 EF Core 可用作對象關係映射程式 (O/RM),這可以實現以下兩點: 使 .NET 開發人員能夠使用 .NET 對象處理資料庫 ...


1. EF Core簡介
Entity Framework (EF) Core 是輕量化、可擴展、開源和跨平臺版的常用 Entity Framework 數據訪問技術。

EF Core 可用作對象關係映射程式 (O/RM),這可以實現以下兩點:

使 .NET 開發人員能夠使用 .NET 對象處理資料庫。
無需再像通常那樣編寫大部分數據訪問代碼。
EF Core 支持多個資料庫引擎,請參閱資料庫提供程式瞭解詳細信息。

Code First :先編寫 C# 實體類,EF Core 會根據實體類之間的關係創建資料庫;

Database First :先設計和創建資料庫,EF Core 根據資料庫的表結構生成 C# 實體類。

 DBFirst

1.點擊“工具”->“NuGet包管理器”->“程式包管理器控制台”

分別安裝以下幾個包

Mysql 版本:

Install-Package MySql.Data.EntityFrameworkCore -Pre
Install-Package Pomelo.EntityFrameworkCore.MySql
Install-Package Microsoft.EntityFrameworkCore.Tools

Sql server 版本:

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools

2.在程式包包管理器控制台 中執行以下語句生成 實體類   Scaffold-DbContext指令詳情
–mysql 版本:輸入如下指令,

Scaffold-DbContext "server=.;userid=tech5_kj;pwd=xxx;port=3306;database=tech5_kj;sslmode=none;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force

或者

Scaffold-DbContext "server=.;userid=tech5_kj;pwd=xxx;port=3306;database=tech5_kj;sslmode=none;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -UseDatabaseNames -Force

server:資料庫地址,User Id:賬號,Password:登錄密碼
如果是針對單表的更新,加一個-Tables 後面是要更新的表名

Scaffold-DbContext -Force "Server=****;User Id=root;Password=****;Database=****" -Provider "Pomelo.EntityFrameworkCore.MySql" -Tables "myTable"

–sql server 版本:

Scaffold-DbContext "Data Source=.;Initial Catalog=EFCore_dbfirst;User ID=sa;Password=sa.123" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Force

或者

一般用這個就行!!!!
Scaffold-DbContext "Server=.;Database=EFCoreDemo;uid=sa;pwd=123" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

通用的命令格式

Scaffold-DbContext "資料庫連接字元串" EF組件名(Microsoft.EntityFrameworkCore.SqlServer/Pomelo.EntityFrameworkCore.MySql/等等) -OutputDir 輸出文件夾名稱

參數說明:

-OutputDir *** 實體文件所存放的文件目錄
-ContextDir *** DbContext文件存放的目錄
-Context *** DbContext文件名
-Schemas *** 需要生成實體數據的數據表所在的模式
-Tables *** 需要生成實體數據的數據表的集合
-DataAnnotations
-UseDatabaseNames 直接使用資料庫中的表名和列名(某些版本不支持)
-Force 強制執行,重寫已經存在的實體文件

 運行成功後,生成如下實體類

 

 context中配置資料庫連接時,使用明文產生此警告,可改為使用配置文檔

 

 添加配置文檔appsettings.json

{
  "ConnectionStrings": {
    "NpgsqlDbConn_DBFirst": "Server=127.0.0.1;Port=5432;Database=EFCoreDB;User Id=postgres;Password=1;",
    "MysqlDbConn_CodeFirst": "Server=127.0.0.1;Port=3306;Database=EFCoreCode;User Id=root;Password=hirosedb;"
  }
} 

 調用

nuget 引用以下三個包:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.FileExtensions
Microsoft.Extensions.Configuration.Json
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                IConfiguration config = new ConfigurationBuilder()
                     .SetBasePath(Directory.GetCurrentDirectory())
                     .AddJsonFile("appsettings.json")
                     .Build();
                string ConnectStr = config.GetConnectionString("NpgsqlDbConn_DBFirst");
                optionsBuilder.UseNpgsql(ConnectStr);
            }
        } 

   CodeFirst

CodeFirst使用Mysql,Nuget安裝如下包

 

 

 新建實體類:Book、Comment,使用特性實體與資料庫對應

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
 
namespace EFCore_CodeFirst
{
    [Table("Book")]   //表名
    public class Book
    {
        [Key]    //主鍵
        [Column("Id")]  //列名
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]  //主鍵自增
        public int Id { get; set; }
        [Column("Title")]
        public string? Title { get; set; }
        [Column("Price")]
        public double? Price { get; set; }
        [Column("PubTime")]
        public DateTime? PubTime { get; set; }=DateTime.Now;
        [Column("AuthorName")]
        public string? AuthorName { get; set; }
    }
} 
[Table("Comment")]
    public class Comment
    {
        [Key]
        [Column("Id")]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        [Column("Title")]
        public string? Title { get; set; }
        [Column("CreatedDate")]
        public DateTime CreatedDate { get; set; }=DateTime.Now;
        [Column("CommentStr")]
        public string? CommentStr { get; set; }
    } 

創建context類,繼承DbContext

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
 
namespace EFCore_CodeFirst
{
    public class CodeFContext : DbContext
    {
        //定義實體  EFcore預設追蹤
        public DbSet<Book> Books { get; set; } = null!;
        public DbSet<Comment> Comments { get; set; } = null!;
        private string ConnectStr=null!;
 
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                IConfiguration config = new ConfigurationBuilder()
                     .SetBasePath(Directory.GetCurrentDirectory())
                     .AddJsonFile("appsettings.json")
                     .Build();
                ConnectStr = config.GetConnectionString("MysqlDbConn_CodeFirst");
                optionsBuilder.UseMySql(ConnectStr, ServerVersion.AutoDetect(ConnectStr));
            }
        }
 
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
        }
    }
} 

由實體生成資料庫,將EFCore_CodeFirst設為啟動項目,調用指令add-migration "變數";

 

 

 會生成如下文件

 

 

 調用指令Update-Database ,更新資料庫

 

 

 使用Navicat查看資料庫,生成成功

 

 

 

 EF Core -- 增刪改查

先new一個context實例,通過綁定跟蹤的DbSet實體,實現數據操作

private CodeFContext codeFContext= new CodeFContext();

 查詢

private List<Book> _books;
 
        public List<Book> Books
        {
            get => _books; 
            set => SetProperty  (ref _books, value);
        }
//查詢Book表所有數據
Books = codeFContext.Books.ToList();
//條件查詢,linq操作
Books = codeFContext.Books.Where(x => x.Id > 3).ToList(); 

插入

private async void InsertData()
        {
            var books=new List<Book>() { 
                new Book() { Title ="追風箏的人"},
                new Book() { Title ="霍亂時期的愛情"}
            };
            //修改DbSet
            codeFContext.Books.AddRange(books);
            //再save更改
            await codeFContext.SaveChangesAsync();
        } 

更新

private async void UpdateData()
        {
            //需要先查詢
            var books = codeFContext.Books.Where(x => x.Title == "追風箏的人");
            //再對查詢到的數據進行修改
            foreach (var item in books)
            {
                item.Title = "放學後";
            }
            //再save更改
            await codeFContext.SaveChangesAsync();
 
        } 

刪除

private async void DeleteData()
        {
            //先Linq查詢
            var books= codeFContext.Books.Where(x => x.Id>5);
            //從實體中刪除數據
            codeFContext.Books.RemoveRange(books);
            //再save更改
            await codeFContext.SaveChangesAsync();
        } 

EF Core -- 批量更新

EF 目前不提供用於執行批量更新的 API.

 使用EFCore.BulkExtensions操作Postgresql

 Bulk相關(一條操作一個事務,均是傳入實體)

//查詢
List<Student> students =new List<Student>();
 await dbFContext.BulkReadAsync(students);
//插入
var students = new List<Student>(){
                new Student() {Id=1, Name = "AA" ,StuNum="2010"},
                new Student() {Id=2, Name = "BB" ,StuNum="2011"},
                new Student() {Id=3, Name = "CC",StuNum="2012" }};
            await dbFContext.BulkInsertAsync(students);
//刪除
var stus = dbFContext.Students;
            await dbFContext.BulkDeleteAsync(stus.ToList());
//更新
var stus = dbFContext.Students.ToList();
            foreach (var item in stus)
            {
                item.Name += "QQQ";
            }
            await dbFContext.BulkUpdateAsync(stus); 

Batch相關(按條件)

//刪除
await dbFContext.Students.Where(x=>x.Name=="BB").BatchDeleteAsync();
//更新(改成新數據)
await dbFContext.Students.Where(x => x.StuNum == "2222").BatchUpdateAsync(new Student() {StuNum="2233" });
//更新(基於原數據)
await dbFContext.Students.Where(x => x.StuNum == "2233").BatchUpdateAsync(x=>new Student() { StuNum =x.StuNum+ "444" }); 

事務

//Bulk相關(一條操作一個事務,均是傳入實體)
        //直接使用這些操作時,每個操作都是獨立的事務,並且會自動提交。
        //如果我們需要在單個過程中執行多個操作,則應使用顯式事務
        public async void TransactionTest()
        {
            using (var transaction= dbFContext.Database.BeginTransaction())
            {
                try
                {
                    var students = new List<Student>(){
                     new Student() {Id=6, Name = "DD" ,StuNum="2044"},
                     new Student() {Id=7, Name = "EE" ,StuNum="2055"}};
                    await dbFContext.BulkInsertAsync(students);
                    await dbFContext.Students.Where(x => x.StuNum == "2044").BatchUpdateAsync(new Student() { Name = "DDEEF" });
                    transaction.Commit();
                }
                catch (Exception ex )
                {
                    //using包裹不需要手寫rollback,報錯會自動回滾
                    Console.WriteLine(ex.Message);
                }
                
            }
        } 

使用 Zack.EFCore.Batch.MySQL.Pomelo_NET6 操作Mysql

//添加配置
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseBatchEF_MySQLPomelo();
            }
        }
 
 
//批量刪除,
await codeFContext.DeleteRangeAsync<Book>(x=>x.Id>5);
//批量更新,條件,設置更新的列和值,執行
            await codeFContext.BatchUpdate<Book>()
                .Where(x => x.Title == "放學後")
                .Set(x=>x.Title,x=>x.Title+"Test")
                .Set(x=>x.Price,x=>20)
                .ExecuteAsync();
//批量刪除和批量更新都支持通過Take()、Skip()來實現部分刪除和部分更新
// Take(3) 代表選取3個 ,如果滿足條件的不足3個 那就有幾個選幾個 可以一個都沒有,超過的話只選順序前 3 個
await codeFContext.Books.Where(x=>x.Id>5).Take(3).DeleteRangeAsync(codeFContext);
//Skip(3) 代表跳過3個 ,如果滿足條件的不足3個 那就有幾個選幾個 跳過幾個,超過的話只跳過順序的前 3 個
await codeFContext.BatchUpdate<Book>()
                .Where(x => x.Title == "放學後")
                .Set(x => x.Title, x => x.Title + "Test")
                .Set(x => x.Price, x => 20)
                .Skip(3)
                .ExecuteAsync();
//批量插入
var books=new List<Book>() { 
                new Book() { Title ="追風箏的人"},
                new Book() { Title ="霍亂時期的愛情"}
            };
            await codeFContext.BulkInsertAsync(books); 

 

相關鏈接: https://blog.csdn.net/a549742320/article/details/124094237

                  https://www.cnblogs.com/wl-blog/p/16500751.html

 

如果這篇文章對你有幫助的話,評論或推薦下吧!(轉載請註明原作者!)
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 將一個正整數n拆分成若幹個正整數的和(至少兩個數,n<=100)。 輸入格式: 一個正整數n 輸出格式: 若幹行,每行一個等式(數與數之間要求非降序排列)。最後一行給出解的總個數 輸入樣例: 在這裡給出一組輸入。例如: 4 輸出樣例: 4=1+1+1+1 4=1+1+2 4=1+3 4=2+2 4 ...
  • 線程理論 線程和進程的區別 進程 進程是操作系統分配資源的最小單位,每個進程都是一個在運行中的程式,在windows中一個運行的xx.exe就是一個進程,他們都擁有自己獨立的一塊記憶體空間,一個進程可以有多個線程 線程 線程是操作系統調度的最小單元,負責當前進程中程式的執行,一個進程可以運行多個線程, ...
  • RabbitMQ的工作模式 一、模式概述 **RabbitMQ提供了6種工作模式:**簡單模式、工作隊列模式、訂閱模式、路由模式、通配符模式、遠程調用模式 其中遠程調用模式(RPC)暫不作介紹。 官網對於模式介紹:https://www.rabbitmq.com/getstarted.html 二、 ...
  • 1 函數 1.1函數的介紹 1.1.1 函數的概述 函數是c語言的功能單位。實現一個功能可以封裝一個函數來實現。 定義函數的時候一切以功能為目的,根據功能去定函數的參數和返回值需要傳哪些數據給函數?(實參)、函數的功能代碼(函數體)如何實現?函數需要返回什麼類型的數據?考慮(傳入參數、函數體、返回值 ...
  • C#參數修飾 ref修飾符: 使用ref修飾符可以使參數成為一個引用類型,從而允許我們在函數中修改該參數的值。如果我們將一個變數傳遞給一個使用ref修飾符的參數,那麼任何對該參數的修改都將影響到原始變數的值。例如: void MyFunction(ref int myParam) { myParam ...
  • 本次使用 SqlConnection 來連接資料庫,使用 DataGridView 來顯示查詢的結果。最終效果如下: 一、連接資料庫 1.獲取連接資料庫所需的字元串,包括伺服器名稱,資料庫名稱,用戶名以及密碼,可在配置文件中配置,或直接在代碼里寫死 在配置文件 App.config 中配置的代碼: ...
  • 前言 ASP.NET Core Web API 介面限流、限制介面併發數量,我也不知道自己寫的有沒有問題,拋磚引玉、歡迎來噴! 需求 寫了一個介面,參數可以傳多個人員,也可以傳單個人員,時間範圍限制最長一個月。簡單來說,當傳單個人員時,介面耗時很短,當傳多個人員時,一般人員會較多,介面耗時較長,一般 ...
  • 在 C# 使用 Solr 搜索 sitecore 的配置信息文件可直接丟進 <Instance>\App_Config 下,sitecore 會自動檢測配置文件更新並載入到記憶體中。 通常情況下,配置信息文件是放在 <Instance>\App_Config\Include\<Project> 下,< ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...