ASP.NET Core使用EF Core操作MySql資料庫

来源:https://www.cnblogs.com/alan-lin/archive/2018/11/30/9997657.html
-Advertisement-
Play Games

ASP.NET Core操作MySql資料庫, 這樣整套環境都可以佈署在Linux上 使用微軟的 Microsoft.EntityFrameworkCore(2.1.4) 和MySql出的 MySql.Data.EntityFrameworkCore(8.0.13) 軟體版本 Asp.net Cor ...


ASP.NET Core操作MySql資料庫, 這樣整套環境都可以佈署在Linux上

使用微軟的 Microsoft.EntityFrameworkCore(2.1.4) 和MySql出的 MySql.Data.EntityFrameworkCore(8.0.13)

 

軟體版本

Asp.net Core:2.1

MySql:5.6

 

項目結構

Snai.Mysql 是 Asp.net core 2.0 Api網站,Database 下的是MySql建庫建表腳本

項目實現

一、MySql 建庫建表

使用 Database下的 mysql 建庫 表 主鍵 索引.sql 腳本建庫建表,腳本如下:

CREATE DATABASE alan CHARACTER SET utf8 COLLATE utf8_general_ci
;

USE alan
;

CREATE TABLE student(
    id INT AUTO_INCREMENT PRIMARY KEY,            -- 自增列需為主鍵
    `name` NVARCHAR(32) NOT NULL DEFAULT '',
    sex TINYINT NOT NULL DEFAULT 1,                -- 0 男生,1 女生,2 保密
    age INT NOT NULL DEFAULT 0
)
;
   
ALTER TABLE student ADD INDEX ix_student_name(`name`)          -- UNIQUE INDEX 唯一索引

建庫時加上 CHARACTER SET utf8 COLLATE utf8_general_ci 代碼,設置資料庫字元集為 utf8,配合程式的資料庫連接串加上 CharSet=utf8,防止中文保存時亂碼

如果建庫時不是utf8,就把字元集改為utf8

二、EF Core 連接操作 MySql 資料庫

1、新建項目,添加EF Core 和 MySql驅動依賴項

新建 asp.net core api 網站程式,NuGet 添加依賴項 Microsoft.EntityFrameworkCore.Tools(2.1.4) 和 MySql.Data.EntityFrameworkCore(8.0.13) 包

2、添加實體類Student和資料庫上下文

新建 Entities 目錄,在,根據表及欄位,在目錄下新建 Student 實體類,在類上加  [Table("student")] 表名、屬性上加[Column("id")] 欄位名等與表對應,代碼如下:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace Snai.Mysql.Entities
{
    [Table("student")]
    public class Student
    {
        [Column("id")]
        public int ID { get; set; }

        [Column("name")]
        public string Name { get; set; }

        [Column("sex")]
        public byte Sex { get; set; }
        
        [Column("age")]
        public int Age { get; set; }
    }
}

在根目錄下加上 DataAccess 目錄做為資料庫操作目錄,在該目錄下加上 Base 目錄做資料庫上下文目錄

在 Base 目錄下新建 AlanContext 上下文類,繼承 DbContext 類,通過構造函數註入資料庫連接,添加 DbSet<Student> 實體屬性,代碼如下:

using Microsoft.EntityFrameworkCore;
using Snai.Mysql.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Snai.Mysql.DataAccess.Base
{
    public class AlanContext:DbContext
    {
        public AlanContext(DbContextOptions<AlanContext> options)
            : base(options)
        { }

        public DbSet<Student> Student { get; set; }
    }
}

3、添、刪、改、查 資料庫記錄

在 DataAccess 目錄下新建 Interface 目錄,用於保存資料庫操作的介面,在該目錄下新建 IAlanDao 介面,在介面里增加 CreateStudent(),GetStudents(),GetStudentByID(),UpdateStudent(),UpdateNameByID(),DeleteStudentByID() 資料庫 添、刪、改、查介面,代碼如下:

using Snai.Mysql.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Snai.Mysql.DataAccess.Interface
{
    public interface IAlanDao
    {
        //插入數據
        bool CreateStudent(Student student);

        //取全部記錄
        IEnumerable<Student> GetStudents();

        //取某id記錄
        Student GetStudentByID(int id);

        //根據id更新整條記錄
        bool UpdateStudent(Student student);

        //根據id更新名稱
        bool UpdateNameByID(int id, string name);

        //根據id刪掉記錄
        bool DeleteStudentByID(int id);
    }
}

在 DataAccess 目錄下新建 Implement 目錄,用於保存資料庫操作介面的實現,在該目錄下新建 AlanDao 類,繼承 IAlanDao 介面,實現介面里的資料庫操作方法,在構造函數註入 AlanContext 資料庫上下文,代碼如下:

using Snai.Mysql.DataAccess.Base;
using Snai.Mysql.DataAccess.Interface;
using Snai.Mysql.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Snai.Mysql.DataAccess.Implement
{
    public class AlanDao: IAlanDao
    {
        public AlanContext Context;

        public AlanDao(AlanContext context)
        {
            Context = context;
        }

        //插入數據
        public bool CreateStudent(Student student)
        {
            Context.Student.Add(student);
            return Context.SaveChanges() > 0;
        }

        //取全部記錄
        public IEnumerable<Student> GetStudents()
        {
            return Context.Student.ToList();
        }

        //取某id記錄
        public Student GetStudentByID(int id)
        {
            return Context.Student.SingleOrDefault(s => s.ID == id);
        }

        //根據id更新整條記錄
        public bool UpdateStudent(Student student)
        {
            Context.Student.Update(student);
            return Context.SaveChanges() > 0;
        }

        //根據id更新名稱
        public bool UpdateNameByID(int id, string name)
        {
            var state = false;
            var student = Context.Student.SingleOrDefault(s => s.ID == id);

            if (student != null)
            {
                student.Name = name;
                state = Context.SaveChanges() > 0;
            }

            return state;
        }

        //根據id刪掉記錄
        public bool DeleteStudentByID(int id)
        {
            var student = Context.Student.SingleOrDefault(s => s.ID == id);
            Context.Student.Remove(student);
            return Context.SaveChanges() > 0;
        }
    }
}

4、添加 StudentController 控制器,調用資料庫操作方法

在 Controllers 目錄下,添加 StudentController 控制器,在構造函數註入 AlanDao 資料庫操作,在控制器里 創建 Create(),Gets(),Get(),Update(),UpdateName(),Delete()等方法,調用 AlanDao 資料庫操作方法,代碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Snai.Mysql.DataAccess.Interface;
using Snai.Mysql.Entities;

namespace Snai.Mysql.Controllers
{
    public class StudentController : ControllerBase
    {
        private IAlanDao AlanDao;

        public StudentController(IAlanDao alanDao)
        {
            AlanDao = alanDao;
        }

        //插入數據
        public ActionResult<string> Create(string name, byte sex, int age)
        {
            if (string.IsNullOrEmpty(name.Trim()))
            {
                return "姓名不能為空";
            }

            if (sex < 0 || sex > 2)
            {
                return "性別數據有誤";
            }

            if (age <= 0)
            {
                return "年齡數據有誤";
            }

            var student = new Student() {
                Name = name,
                Sex = sex,
                Age = age
            };

            var result = AlanDao.CreateStudent(student);

            if (result)
            {
                return "學生插入成功";
            }
            else
            {
                return "學生插入失敗";
            }
            
        }

        //取全部記錄
        public ActionResult<string> Gets()
        {
            var names = "沒有數據";
            var students = AlanDao.GetStudents();

            if (students != null)
            {
                names = "";
                foreach (var s in students)
                {
                    names += $"{s.Name} \r\n";
                }
                    
            }

            return names;
        }

        //取某id記錄
        public ActionResult<string> Get(int id)
        {
            var name = "沒有數據";
            var student = AlanDao.GetStudentByID(id);

            if (student != null)
            {
                name = student.Name;
            }

            return name;
        }

        //根據id更新整條記錄
        public ActionResult<string> Update(int id, string name, byte sex, int age)
        {
            if (id <= 0)
            {
                return "id 不能小於0";
            }

            if (string.IsNullOrEmpty(name.Trim()))
            {
                return "姓名不能為空";
            }

            if (sex < 0 || sex > 2)
            {
                return "性別數據有誤";
            }

            if (age <= 0)
            {
                return "年齡數據有誤";
            }

            var student = new Student()
            {
                ID = id,
                Name = name,
                Sex = sex,
                Age = age
            };

            var result = AlanDao.UpdateStudent(student);

            if (result)
            {
                return "學生更新成功";
            }
            else
            {
                return "學生更新失敗";
            }
        }

        //根據id更新名稱
        public ActionResult<string> UpdateName(int id, string name)
        {
            if (id <= 0)
            {
                return "id 不能小於0";
            }

            if (string.IsNullOrEmpty(name.Trim()))
            {
                return "姓名不能為空";
            }

            var result = AlanDao.UpdateNameByID(id, name);

            if (result)
            {
                return "學生更新成功";
            }
            else
            {
                return "學生更新失敗";
            }
        }

        //根據id刪掉記錄
        public ActionResult<string> Delete(int id)
        {
            if (id <= 0)
            {
                return "id 不能小於0!";
            }

            var result = AlanDao.DeleteStudentByID(id);

            if (result)
            {
                return "學生刪除成功";
            }
            else
            {
                return "學生刪除失敗";
            }
        }
    }
}

5、配置資料庫連接串,註冊資料庫連接到容器,註冊資料庫操作類到容器,修改路由

在 appsettings.json 中配置資料庫連接串 "AlanConnection": "server=localhost;port=3306;database=alan;uid=root;pwd=123456;CharSet=utf8" CharSet=utf8 是為了配合資料庫 utf8 字元集,防止中文亂碼:

{
  "ConnectionStrings": {
    "AlanConnection": "server=localhost;port=3306;database=alan;uid=root;pwd=123456;CharSet=utf8"
  }
}

修改 Startup.cs 類的 ConfigureServices() 方法,註冊資料庫連接,註冊資料庫操作類

註冊資料庫連接 services.AddDbContext<AlanContext>(options => options.UseMySQL(Configuration.GetConnectionString("AlanConnection")));

UseMySql() 為使用 MySql 資料庫,如果是 Sql Server 則使用 UseSqlServer()

註冊資料庫操作類 services.AddScoped<IAlanDao, AlanDao>();

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<AlanContext>(options => options.UseMySQL(Configuration.GetConnectionString("AlanConnection")));
    services.AddScoped<IAlanDao, AlanDao>();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

修改路由,添加預設路由,以  controller、action,MVC的路徑方式訪問而不是 restful api 路徑方式訪問

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

到此代碼編寫已完成

三、運行測試資料庫添、刪、改、查

運行項目

1、添加記錄,打開 http://localhost:5000/Student/Create?name=小木&sex=0&age=18 地址,數據插入成功

image

微信截圖_20181130103801

2、查詢全部記錄,打開 http://localhost:5000/Student/Gets 地址,取姓名列表成功

image

image

3、查詢指定id的記錄,打開 http://localhost:5000/Student/Get?id=1 地址,取姓名成功

image

4、更新指定id的整條記錄,打開 http://localhost:5000/Student/Update?id=1&name=小森&sex=1&age=18 地址,更新整條記錄成功

image

image

5、更新指定id的姓名,打開 http://localhost:5000/Student/UpdateName?id=2&name=amos 地址,更新姓名成功

image

image

6、刪除指定id的記錄,打開 http://localhost:5000/Student/Delete?id=2 地址,刪除記錄成功

image

image

 

EF Core 添、刪、改、查 MySql 資料庫已完成

源碼訪問地址:https://github.com/Liu-Alan/Snai.Study/tree/master/Snai.Mysql


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一,項目簡介 1.利用Java GUI 繪製圖像界面,設置整體佈局 2.編寫一個隨機數生成1~100的隨機數 3.編寫一個驗證類,用於驗證用戶輸入值與生成隨機數是否相等並記錄用戶猜測次數,當用戶猜測成功或者超過5次結束游戲 二,運行界面 三,代碼實現 補充 我的註意事項: ...
  • 小伙伴們好今天給大家分享一下冒泡排序法: 它的原理是利用兩次for迴圈,外層for用來控制輪數,內層for用來控制每一輪比較的次數,比較時每相鄰的兩個數進行比較依次向後,這樣每一輪都會出比較出一個極值。 ...
  • 一道DP。 給你一個矩陣裡面有很多數,你需要從上往下找到一種跳躍方法使得經過的點的價值之和最大。 具體題面見鏈接 洛谷P1107 BZOJ1270 很明顯是一個二維的DP。 混搭碼風,求諒解。 ...
  • Python基礎知識(18):面向對象高級編程 使用__slots__:限制實例的屬性,只允許實例對類添加某些屬性 (1)實例可以隨意添加屬性 (2)某個實例綁定的方法對另一個實例不起作用 (3)給類綁定方法市所有類都綁定了該方法,且所有實例都可以調用該方法 用__slots__定義屬性反對這個類的 ...
  • 熟悉java的過程中發現了一些小問題,定義的類Car老是提示必須在它自己的文件中定義。自己想了想試試把Car繼承的類Vehicle中的public換到Car類中,結果發現輸出問題很大。它只顯示了一個輸出(我代碼有4個輸出)。後來查了查度娘原來是public類的類名和存儲的.java名字要一樣。問題雖 ...
  • 感謝博客園團隊日夜為廣大需要獲取知識人們所做的奉獻 博客園團隊您們辛苦了 ASP.NET MVC 實現有論壇功能的網站(有iis發佈網站 這是之前寫的... www.lazyfitness.cn 經過一個月的修正 通過ASP.NET MVC 所做的網站www.lazyfitness.cn正式發佈了! ...
  • 翻看了下以前大學學習的一些小項目,突然發現有個項目比較有意思,覺得有必要把它分享出來。當然現在看來,裡面有很多的不足之處,但因博主現在已經工作,沒有時間再去優化。這個項目就是利用C#編寫一個Windows系統下的掃雷小游戲。 首先講下掃雷小游戲的玩法: (1)掃雷就是要把所有非地雷的格子揭開即勝利; ...
  • ASP.NET與ASP.NET Core很類似,但它們之間存在一些細微區別以及ASP.NET Core中新增特性的使用方法,在此之前也寫過一篇簡單的對比文章ASP.NET MVC應用遷移到ASP.NET Core及其異同簡介,但沒有進行深入的分析和介紹,在真正使用ASP.NET Core進行開發時, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...