EFCore框架相关的内容可以参考笔记库的软件工程/dotNet/EFCore
相关章节。这篇笔记我们介绍如何在ASP.NET Core工程中使用EFCore操作数据库表。
我们这里使用.NET6版本和MySQL数据库,执行命令安装以下NuGet依赖项。
dotnet add package Microsoft.EntityFrameworkCore --version 6.0.36
dotnet add package Microsoft.EntityFrameworkCore.Tools --version 6.0.36
dotnet add package Pomelo.EntityFrameworkCore.MySql --version 6.0.3
操作数据迁移时需要执行EFCore的命令行工具,这需要用到dotnet ef
命令,如果我们尚未安装该命令行工具,可以执行以下命令安装。
dotnet tool install --global dotnet-ef --version 6.0.36
下面代码我们创建了DbContext和自定义的数据模型Student
。
using Microsoft.EntityFrameworkCore;
namespace DemoWebAPI.Models;
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<Student> Students { get; set; }
}
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace DemoWebAPI.Models;
[Table("t_student")]
public class Student
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Column("student_id")]
public long StudentId { get; set; }
[Required]
[Column("student_name")]
public string StudentName { get; set; }
[Required]
[Column("age")]
public int Age { get; set; }
[Required]
[Column("create_time")]
public DateTime CreateTime { get; set; }
}
在Program.cs
中,我们需要调用builder.Services.AddDbContext()
方法注册EFCore需要使用的DbContext
。
using DemoWebAPI.Models;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 集成EFCore相关服务
builder.Services.AddDbContext<AppDbContext>(options =>
{
const string connStr = "Server=localhost;Port=3306;Database=netstore;User=root;Password=root;";
options.UseMySql(connStr, ServerVersion.AutoDetect(connStr));
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
代码中,我们指定了MySQL数据库服务器的连接串,出于节省篇幅考虑这里我们是写在代码里的,实际开发中建议配置在appsettings.json
内并通过配置框架读取。
如上配置好数据模型、DbContext并注册到ASP.NET Core后,我们就可以创建并执行数据迁移了,我们可以执行以下命令进行操作。
dotnet ef migrations add InitialCreate
dotnet ef database update
数据迁移执行后,我们可以查看数据库中的表结构,如果一切正常,我们可以看到自动创建的__EFMigrationsHistory
和我们数据模型对应的t_student
。
下面我们写一个简单的查询接口来演示EFCore在ASP.NET Core中的使用。
using DemoWebAPI.Models;
using Microsoft.AspNetCore.Mvc;
namespace DemoWebAPI.Controllers;
[ApiController]
[Route("api/Demo")]
public class DemoController : ControllerBase
{
private AppDbContext _appDbContext;
public DemoController(AppDbContext appDbContext)
{
_appDbContext = appDbContext;
}
[HttpGet("/GetStudentById")]
public ActionResult<ApiResult> GetStudentById(long id)
{
var s = _appDbContext.Students.SingleOrDefault(s => s.StudentId == id);
return ApiResult.Success(s);
}
}
代码中,我们将AppDbContext
通过依赖注入的方式注入到了控制器中,GetStudentById()
方法接收一个GET参数作为查询条件,最终我们调用EFCore筛选指定主键的值。
注:我们这里出于简单起见直接在控制器中进行了数据操作,实际开发中建议将数据库操作封装到服务层中,并严格按照数据模型、DTO类等划分数据的封装类。