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 SETutf8 COLLATE utf8_general_ci
;USEalan
;CREATE TABLEstudent(
idINT AUTO_INCREMENT PRIMARY KEY, --自增列需为主键
`name` NVARCHAR(32) NOT NULL DEFAULT '',
sexTINYINT 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")] 字段名等与表对应,代码如下:
usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel.DataAnnotations.Schema;usingSystem.Linq;usingSystem.Threading.Tasks;namespaceSnai.Mysql.Entities
{
[Table("student")]public classStudent
{
[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 实体属性,代码如下:
usingMicrosoft.EntityFrameworkCore;usingSnai.Mysql.Entities;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;namespaceSnai.Mysql.DataAccess.Base
{public classAlanContext:DbContext
{public AlanContext(DbContextOptionsoptions)
:base(options)
{ }public DbSet Student { get; set; }
}
}
3、添、删、改、查 数据库记录
在 DataAccess 目录下新建 Interface 目录,用于保存数据库操作的接口,在该目录下新建 IAlanDao 接口,在接口里增加 CreateStudent(),GetStudents(),GetStudentByID(),UpdateStudent(),UpdateNameByID(),DeleteStudentByID() 数据库 添、删、改、查接口,代码如下:
usingSnai.Mysql.Entities;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;namespaceSnai.Mysql.DataAccess.Interface
{public interfaceIAlanDao
{//插入数据
boolCreateStudent(Student student);//取全部记录
IEnumerableGetStudents();//取某id记录
Student GetStudentByID(intid);//根据id更新整条记录
boolUpdateStudent(Student student);//根据id更新名称
bool UpdateNameByID(int id, stringname);//根据id删掉记录
bool DeleteStudentByID(intid);
}
}
在 DataAccess 目录下新建 Implement 目录,用于保存数据库操作接口的实现,在该目录下新建 AlanDao 类,继承 IAlanDao 接口,实现接口里的数据库操作方法,在构造函数注入 AlanContext 数据库上下文,代码如下:
usingSnai.Mysql.DataAccess.Base;usingSnai.Mysql.DataAccess.Interface;usingSnai.Mysql.Entities;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;namespaceSnai.Mysql.DataAccess.Implement
{public classAlanDao: IAlanDao
{publicAlanContext Context;publicAlanDao(AlanContext context)
{
Context=context;
}//插入数据
public boolCreateStudent(Student student)
{
Context.Student.Add(student);return Context.SaveChanges() > 0;
}//取全部记录
public IEnumerableGetStudents()
{returnContext.Student.ToList();
}//取某id记录
public Student GetStudentByID(intid)
{return Context.Student.SingleOrDefault(s => s.ID ==id);
}//根据id更新整条记录
public boolUpdateStudent(Student student)
{
Context.Student.Update(student);return Context.SaveChanges() > 0;
}//根据id更新名称
public bool UpdateNameByID(int id, stringname)
{var state = false;var student = Context.Student.SingleOrDefault(s => s.ID ==id);if (student != null)
{
student.Name=name;
state= Context.SaveChanges() > 0;
}returnstate;
}//根据id删掉记录
public bool DeleteStudentByID(intid)
{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 数据库操作方法,代码如下:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Threading.Tasks;usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc;usingSnai.Mysql.DataAccess.Interface;usingSnai.Mysql.Entities;namespaceSnai.Mysql.Controllers
{public classStudentController : ControllerBase
{privateIAlanDao AlanDao;publicStudentController(IAlanDao alanDao)
{
AlanDao=alanDao;
}//插入数据
public ActionResult Create(string name, byte sex, intage)
{if (string.IsNullOrEmpty(name.Trim()))
{return "姓名不能为空";
}if (sex < 0 || sex > 2)
{return "性别数据有误";
}if (age <= 0)
{return "年龄数据有误";
}var student = newStudent() {
Name=name,
Sex=sex,
Age=age
};var result =AlanDao.CreateStudent(student);if(result)
{return "学生插入成功";
}else{return "学生插入失败";
}
}//取全部记录
public ActionResultGets()
{var names = "没有数据";var students =AlanDao.GetStudents();if (students != null)
{
names= "";foreach (var s instudents)
{
names+= $"{s.Name} \r\n";
}
}returnnames;
}//取某id记录
public ActionResult Get(intid)
{var name = "没有数据";var student =AlanDao.GetStudentByID(id);if (student != null)
{
name=student.Name;
}returnname;
}//根据id更新整条记录
public ActionResult Update(int id, string name, byte sex, intage)
{if (id <= 0)
{return "id 不能小于0";
}if (string.IsNullOrEmpty(name.Trim()))
{return "姓名不能为空";
}if (sex < 0 || sex > 2)
{return "性别数据有误";
}if (age <= 0)
{return "年龄数据有误";
}var student = newStudent()
{
ID=id,
Name=name,
Sex=sex,
Age=age
};var result =AlanDao.UpdateStudent(student);if(result)
{return "学生更新成功";
}else{return "学生更新失败";
}
}//根据id更新名称
public ActionResult UpdateName(int id, stringname)
{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 Delete(intid)
{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(options => options.UseMySQL(Configuration.GetConnectionString("AlanConnection")));
UseMySql() 为使用 MySql 数据库,如果是 Sql Server 则使用 UseSqlServer()
注册数据库操作类 services.AddScoped();
public voidConfigureServices(IServiceCollection services)
{
services.AddDbContext(options => options.UseMySQL(Configuration.GetConnectionString("AlanConnection")));
services.AddScoped();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
修改路由,添加默认路由,以 controller、action,MVC的路径方式访问而不是 restful api 路径方式访问
public voidConfigure(IApplicationBuilder app, IHostingEnvironment env)
{if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc(routes=>{
routes.MapRoute(
name:"default",
template:"{controller=Home}/{action=Index}/{id?}");
});
}
到此代码编写已完成
三、运行测试数据库添、删、改、查
运行项目
EF Core 添、删、改、查 MySql 数据库已完成