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 脚本建库建表,脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
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")] 字段名等与表对应,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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> 实体属性,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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() 数据库 添、删、改、查接口,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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 数据库上下文,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
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 数据库操作方法,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
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 字符集,防止中文乱码:
1 2 3 4 5 |
{ "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>();
1 2 3 4 5 6 7 |
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 路径方式访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 地址,数据插入成功
2、查询全部记录,打开 http://localhost:5000/Student/Gets 地址,取姓名列表成功
3、查询指定id的记录,打开 http://localhost:5000/Student/Get?id=1 地址,取姓名成功
4、更新指定id的整条记录,打开 http://localhost:5000/Student/Update?id=1&name=小森&sex=1&age=18 地址,更新整条记录成功
5、更新指定id的姓名,打开 http://localhost:5000/Student/UpdateName?id=2&name=amos 地址,更新姓名成功
6、删除指定id的记录,打开 http://localhost:5000/Student/Delete?id=2 地址,删除记录成功
EF Core 添、删、改、查 MySql 数据库已完成
Github源码地址:https://github.com/Liu-Alan/Snai.Study/tree/master/Snai.Mysql
from:https://www.cnblogs.com/alan-lin/p/9997657.html