ASP.NET Core使用EF Core操作MySql数据库
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 地址,数据插入成功
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 数据库已完成
源码访问地址:https://github.com/liu-alan/snai.study/tree/master/snai.mysql
推荐阅读
-
.NET Core Dapper操作mysql数据库的实现方法
-
.NET Core Dapper操作mysql数据库的实现方法
-
.Net Core API使用ODP.NET操作Oracle数据库
-
ASP.NET Core使用EF Core操作MySql数据库
-
ASP.NET Core使用HostingStartup增强启动操作方法详解
-
asp.net core 系列 20 EF基于数据模型创建数据库
-
ASP.NET Core使用功能开关控制路由访问操作(续)
-
ASP.NET Core使用功能开关控制路由访问操作
-
asp.net core系列 29 EF模型配置(查询类型,关系数据库建模)
-
ASP.NET Core使用功能开关控制路由访问操作