zoukankan      html  css  js  c++  java
  • ASP.NET Core使用EF Core操作MySql数据库

    参考网址:https://www.cnblogs.com/alan-lin/p/9997657.html

    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 数据库已完成

    Github源码地址:https://github.com/Liu-Alan/Snai.Study/tree/master/Snai.Mysql

     
    分类: .net coremysql
  • 相关阅读:
    虚函数和纯虚函数
    MS CRM 2011中PartyList类型字段的实例化
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(4)
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(2)
    MS CRM 2011的自定义和开发(10)——CRM web服务介绍(第二部分)——IOrganizationService(二)
    MS CRM 2011 SDK 5.08已经发布
    MS CRM 2011 Q2的一些更新
    最近很忙
    Microsoft Dynamics CRM 2011最近的一些更新
    补一篇,Update Rollup 12 终于发布了
  • 原文地址:https://www.cnblogs.com/bruce1992/p/15521120.html
Copyright © 2011-2022 走看看