.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,卸载后重新安装低版本如下:
重新编译后再次运行,结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人