.net5 core webapi进阶之六:ORM框架Entity Framework的使用(数据库MySQL)

ORM(Object Relational Mapping):对象关系映射,它是一种编程框架,

用于自动将数据库中的记录映射成编程语言的对象,

从而将数据库的操作对象由ADO改为编程语言的类,

至于这些对象是如何与数据库交互的,ORM会自动完成,具体如下:

//ADO操作数据库一般是这样的:
OleDbDataReader reader = cmd.ExecuteReader("select * from t_user where user_id=1");
User user = new User();
user.UserName
= reader["user_name"].ToString();
user.Mobile = reader["mobile"].ToString(); user.UserId = Convert.ToInt32(reader["user_id"]);

//ORM操作数据库类似这样的: User user = Db.GetUser(3)

看上去是不是so easy?但实际的业务总是更复杂的,面对一些特殊的查询和事务,还是需要去处理 SQL,

ORM只能解决 95%的问题,至于剩下的 5%,仍然需要开发人员掌握数据库的相关知识来处理复杂业务问题 。

不管怎样,作为一种流行的数据库开发技术,还是需要熟练掌握的,下面就来体验一下。

 

.NET CORE 上的ORM框架很多,常见的有 EF (官方)、Dapper 、NHibernate等,我们以EF为例来演示。

一、开发前准备。

1. 打开MySQL Workbench,新建一个数据库 efdemo,字符集选择 utf8mb4,如下:

再新增一个T_User表,里面包含user_id,user_name,mobile三个字段,其中user_id是自增字段和主键,如下:

向t_user中插入一条记录并查询出来,确认数据库工作正常,如下:

2 . 新建与 t_user 表对应的类文件。

还是使用上篇中的项目 webapidemo3 来演示,在根目录下新建一个 Models的文件夹 ,新增一个

User.cs 的类文件,给属性添加特性,以便建立和数据库字段的对应关系,如下:

添加引用 using System.ComponentModel.DataAnnotations.Schema;,代码如下:

    [Table("t_user")]
    public class User
    {
        [Column("user_id")]
        public int UserId { get; set; }

        [Column("user_name")]
        public string UserName { get; set; }

        [Column("mobile")]
        public string Mobile { get; set; }
    }

为了调试方便,在User.cs中添加一个类 UserExtensions ,加入 PrintUser( ) 方法用于输出User属性的值,如下:

 public static class UserExtensions
    {
        public static string PrintUser(this User user)
        {
            return string.Format("webapidemo3.User : UserId = {0}, UserName = {1}, Mobile = {2}",
                user.UserId, user.UserName, user.Mobile); 
        }
    }

3. 打开appsettings.json文件添加MySQL数据库连接字符串,如下(见红色部分代码):

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MySQL": "server=localhost;database=efdemo;port=3306;user=root;password=1234;Character Set=utf8mb4"
  }
}

4. 在项目中添加NuGet包:Microsoft.EntityFrameworkCore.Tools 和 MySql.Data.EntityFrameworkCore,如下:

(最新的发布日期是2021-2-9,赶在春节前2天发布了。)

5. 在 Models 文件夹中添加 EfDemoContext 数据库上下文,代码如下:

using Microsoft.EntityFrameworkCore;

namespace webapidemo3
{
    public class EfDemoContext:DbContext
    {
        public EfDemoContext(DbContextOptions<EfDemoContext> options)
            : base(options)
        {
        }

        public DbSet<User> Users { get; set; } //每个泛型的DbSet对应一个数据库表的数据集合
    }
}

6. 在 Startup.cs中添加引用 using Microsoft.EntityFrameworkCore; 并在 ConfigureServices( ) 方法中注册数据库上下文, 如下:

public void ConfigureServices(IServiceCollection services)
{ 
     services.AddDbContext<UserContext>(options => options.UseMySQL(Configuration.GetConnectionString("MySQL")));

     services.AddControllers();
}

至此,使用EF的准备工作就完成了。

 

二、终结点编码

1. 在项目的 Controllers 文件夹中加入 UsersController.cs 控制器文件,

然后添加一个 GetUser( ) 的终结点,用于从数据库中获取指定id的用户信息,代码如下:

using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;

namespace webapidemo3.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        private readonly EfDemoContext _context;
        public UsersController(EfDemoContext context)
        {
            _context = context; //注入数据库上下文
        }


        [HttpGet]
        [Route("{id}")]
        public async Task<IActionResult> GetUser(int id)
        {
            User user = await _context.Users.FindAsync(id); //_context的Users属性表示t_user表数据集合

            if (user == null) return NotFound();
          
            return Ok(user.PrintUser()); //调用user实例的扩展方法输出User实例的属性值
        }
    }
}

打开浏览器,运行 http://localhost:51630/api/users/1 , 结果如下:

经查是因为 MySql.Data.EntityFrameworkCore, Version=8.0.22.0 还不支持 Microsoft.EntityFrameworkCore.Tools, Version=5.0.3

应将 Microsoft.EntityFrameworkCore.Tools的版本降级为 Version=3.1.12,卸载后重新安装低版本如下:

重新编译后再次运行,结果如下:

 

posted @ 2021-02-28 19:07  屏风马  阅读(869)  评论(0编辑  收藏  举报