EFCore集成

EFCore框架相关的内容可以参考笔记库的软件工程/dotNet/EFCore相关章节。这篇笔记我们介绍如何在ASP.NET Core工程中使用EFCore操作数据库表。

安装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

下面代码我们创建了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; }
}

注册DbContext

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类等划分数据的封装类。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap