1.EFCore简介
Entity Framework Core 是一个轻量级、跨平台的 ORM 框架,它允许 .NET 开发人员通过面向对象的方式访问数据库。EF Core 可以与各种关系型数据库进行交互,包括 SQL Server、MySQL、PostgreSQL 和 SQLite 等。
2.相关依赖安装
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
Pomelo.EntityFrameworkCore.MySql
注意版本的选择尽量与.NET版本一致,我这里使用的.NET6.0。
3 配置MySQL连接信息
在appsettings.json中添加mysql连接配置如下
"ConnectionStrings": {
"tarefasConnection": "server=localhost;port=3306;uid=root;pwd=123456;database=partner"
}
4 新建User类和UserContext类
代码如下:
User.cs
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;
namespace WebApplication4.db
{
public class User
{
[Key]
[Column("id")]
public int Id { get; set; }
[Column("username")]
public string UserName { get; set; } = null!;
[Column("password")]
public string PassWord { get; set; } = null!;
[Column("departmentname")]
public string DepartmentName { get; set; } = null!;
}
}
UserContext.cs
using Microsoft.EntityFrameworkCore;
using WebApplication4.db;
/// <summary>
/// 这个类用于管理与数据库的交互。
/// </summary>
public partial class UserContext : DbContext
{
public UserContext()
{
}
public UserContext(DbContextOptions<UserContext> options) : base(options)
{
}
//这行代码定义了一个 User 属性,该属性表示数据库中的用户表。
//通过在 DbContext 中声明这样的属性,Entity Framework Core 就能够跟踪和操作与该实体类相关联的数据库表。
//当你对 User 属性进行查询、插入、更新或删除时,
//Entity Framework Core 会负责将这些操作转化为相应的 SQL 查询并与数据库进行交互。
public virtual DbSet<User> User { get; set; } = null!;
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.UseCollation("utf8_general_ci").HasCharSet("utf8");
//指定表名为 "user",设置 "password" 列的最大长度为 200。
modelBuilder.Entity<User>(entity =>
{
entity.ToTable("user");
entity.Property(e => e.PassWord)
.HasMaxLength(200)
.HasColumnName("password");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
5 关于UserContext类的说明
UserContext类继承了DbContext这个类,DbContext是 EFCore 中的一个核心类,它充当了应用程序和数据库之间的桥梁,负责管理与数据库的交互。它提供了一种表示数据模型、配置数据连接和执行数据库操作的方式。以下是 DbContext的主要功能和作用:
5.1 表示数据模型
DbContext类通过使用 DbSet<TEntity>
属性来表示数据库中的表。每个 DbSet<TEntity>
属性都对应一个实体类型,表示数据库中的一张表。这些实体类型通常是应用程序中的类,它们映射到数据库中的表结构。
public class MyDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Todo> Todos { get; set; }
// 其他 DbSet<TEntity> 属性
}
5.2 配置数据库的连接
DbContext用于配置连接到数据库的信息,例如数据库的提供程序(SQL Server、MySQL、SQLite 等)、连接字符串、连接池大小等。这些配置通常在 OnConfiguring
方法中设置,或者通过构造函数传递 DbContextOptions
。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("your_connection_string");
}
5.3 执行数据库操作
DbContext提供了方法来执行对数据库的各种操作,例如查询、插入、更新和删除。这些方法包括 Set<TEntity>()
、Add()
、Update()
、Remove()
等。LINQ 查询也是通过 DbContext来执行的。
5.4 事务操作
DbContext支持事务操作,你可以在一个事务中执行一系列数据库操作,然后一次性提交或回滚。
using (var transaction = dbContext.Database.BeginTransaction())
{
try
{
// 执行一系列数据库操作
dbContext.SaveChanges();
transaction.Commit();
}
catch (Exception)
{
transaction.Rollback();
}
}
6 依赖注入
在program.cs中注入UserContext依赖。
builder.Services.AddDbContext<UserContext>(opt =>
{
string connectionString = builder.Configuration.GetConnectionString("tarefasConnection");
var serverVersion = ServerVersion.AutoDetect(connectionString);
opt.UseMySql(connectionString, serverVersion);
});
7.执行迁移操作
7.1 什么是迁移
在 EFCore 中,迁移(Migration)是一种将数据模型的变化应用到数据库的机制。当你对应用程序的数据模型进行更改时,可能会涉及到添加新表、更改表结构、删除表等操作。为了使这些变化反映在数据库中,你需要执行迁移。步骤如下:
点击工具-->NuGet包管理器-->程序包管理控制台:
输入以下命令:
Add-Migration init
Update-Database
无报错的情况下,即完成迁移操作。此时在项目的目录下可以看到一个新的文件夹Migrations,是用于存储迁移文件的地方。UserContextModelSnapshot.cs里存放的是数据模型的快照,快照(Snapshot)是用于记录数据模型当前状态的一个内部数据结构。它在迁移过程中发挥着重要的作用。当你创建迁移时,EF Core 使用快照来比较当前数据模型与之前迁移所生成的模型之间的差异,从而生成一个新的迁移。
7.1 打开Navicate查看表结构
8 数据增删改查接口
UserController.cs
using Microsoft.AspNetCore.Mvc;
using WebApplication4.db;
namespace WebApplication4.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class UserController : ControllerBase
{
UserContext userContext;
public UserController(UserContext userContext)
{
this.userContext = userContext;
}
/// <summary>
/// 新增用户
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
[HttpPost]
public ObjectResult AddUser([FromBody] User user)
{
try
{
userContext.User.Add(user);
userContext.SaveChanges();
return new ObjectResult("用户添加成功");
}
catch(Exception ex)
{
throw ex;
}
}
[HttpGet]
public ObjectResult getUsers() {
try
{
List<User> users = userContext.User.ToList(); //查出所有
return new ObjectResult(users);
}
catch( Exception ex )
{
throw ex;
}
}
[HttpDelete]
public ObjectResult DelUserById(int id) {
var user = userContext.User.Find(id);
if (user != null)
{
try
{
userContext.User.Remove(user);
userContext.SaveChanges();
return new ObjectResult("用户删除成功");
}catch(Exception ex)
{
throw ex;
}
}
else
{
return new ObjectResult("用户不存在");
}
}
[HttpPut]
public ObjectResult update([FromBody]User user)
{
try
{
userContext.User.Update(user);
userContext.SaveChanges();
return new ObjectResult("修改成功");
}catch(Exception ex)
{
throw ex;
}
}
}
}
2024年3月22补充:
Scaffold-DbContext "server=localhost;userid=root;pwd=123456;port=3306;database=manager;sslmode=Preferred;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force
在程序包股那里控制台输入此命令可生成数据库中每个表对应的实体类。