欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET Core使用EF Core操作MySql数据库

程序员文章站 2022-05-14 10:46:18
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

 

项目结构

ASP.NET Core使用EF Core操作MySql数据库

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

ASP.NET Core使用EF Core操作MySql数据库

ASP.NET Core使用EF Core操作MySql数据库

ASP.NET Core使用EF Core操作MySql数据库

二、ef core 连接操作 mysql 数据库

1、新建项目,添加ef core 和 mysql驱动依赖项

新建 asp.net core api 网站程序,nuget 添加依赖项 microsoft.entityframeworkcore.tools(2.1.4) 和 mysql.data.entityframeworkcore(8.0.13) 包

ASP.NET Core使用EF Core操作MySql数据库

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