深入探索 EF Core 数据库迁移与表生成实体

开发 前端
在实际项目中,可根据团队开发流程灵活运用,如在新项目启动时利用迁移创建初始架构,后期迭代持续更新;对接遗留数据库时,先逆向生成实体再按需优化调整,充分发挥 EF Core 的强大功能。

一、引言

Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)框架,在.NET 开发中广泛应用于数据库交互。其中,数据库迁移功能允许我们以代码优先的方式管理数据库架构的演变,而从现有数据库表生成实体类则为逆向工程提供了便利,大大提高开发效率。本文将详细讲解这两个关键操作的具体步骤,并附上实例,帮助读者快速上手。

二、EF Core 数据库迁移

(一)环境搭建

首先,确保你的项目已安装必要的 NuGet 包。对于一个.NET Core 项目,需要引入  Microsoft.EntityFrameworkCore 、 Microsoft.EntityFrameworkCore.Design 、 Microsoft.EntityFrameworkCore.SqlServer (这里以 SQL Server 为例,若使用其他数据库,如 MySQL,则引入对应的包,如  Pomelo.EntityFrameworkCore.MySql )。

(二)创建 DbContext 类

DbContext 是 EF Core 与数据库交互的核心类,它负责协调实体类与数据库之间的操作。例如,创建一个名为  MyDbContext  的类:

复制

using Microsoft.EntityFrameworkCore;

public class MyDbContext : DbContext
{
    public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
    {
    }

    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }
}

这里定义了两个  DbSet  属性,分别对应  Blog  和  Post  实体(后续会详细讲解实体类),它们代表数据库中的表。

(三)配置数据库连接

在  Startup.cs (ASP.NET Core 项目)或程序入口点处,配置数据库连接字符串并将  DbContext  注入到服务容器中:

复制

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        var connectionString = "Server=(localdb)\\mssqllocaldb;Database=MyBlogDb;Trusted_Connection=True;";
        services.AddDbContext<MyDbContext>(options =>
            options.UseSqlServer(connectionString));

        // 其他服务注册
    }

    // 其他配置方法
}

(四)创建初始迁移

打开命令行工具,切换到项目目录,执行以下命令:

复制

dotnet ef migrations add InitialCreate

这一步会在项目中创建一个  Migrations  文件夹,里面包含了描述数据库初始架构的代码文件。例如,生成的迁移文件可能包含创建  Blogs  和  Posts  表的代码,类似:

复制

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Blogs",
            columns: table => new
            {
                BlogId = table.Column<int>(nullable: false)
                   .Annotation("SqlServer:Identity", "1, 1"),
                Url = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Blogs", x => x.BlogId);
            });

        migrationBuilder.CreateTable(
            name: "Posts",
            columns: table => new
            {
                PostId = table.Column<int>(nullable: false)
                   .Annotation("SqlServer:Identity", "1, 1"),
                Title = table.Column<string>(nullable: true),
                Content = table.Column<string>(nullable: true),
                BlogId = table.Column<int>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Posts", x => x.PostId);
                table.ForeignKey(
                    name: "FK_Posts_Blogs_BlogId",
                    column: x => x.BlogId,
                    principalTable: "Blogs",
                    principalColumn: "BlogId",
                    onDelete: ReferentialAction.Cascade);
            });
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Posts");
        migrationBuilder.DropTable(
            name: "Blogs");
    }
}

 Up  方法定义了如何将数据库迁移到新版本,即创建表; Down  方法则用于回滚迁移,删除相应表。

(五)应用迁移到数据库

执行以下命令将迁移应用到数据库:

复制

dotnet ef database update

此时,数据库中会创建  Blogs  和  Posts  表,架构与迁移文件中定义一致。

三、从数据库表生成实体

(一)安装反向工程工具

EF Core 提供了反向工程工具,同样需要通过 NuGet 安装。执行命令:

复制

dotnet tool install --global dotnet-ef

确保工具安装成功。

(二)生成实体类

在命令行中,执行以下命令:

复制

dotnet ef dbcontext scaffold "Server=(localdb)\\mssqllocaldb;Database=MyBlogDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

这里的连接字符串指向要逆向工程的数据库, Microsoft.EntityFrameworkCore.SqlServer  表明数据库类型, -o Models  指定生成的实体类文件输出到  Models  文件夹。

生成的实体类会自动包含对应表的属性,例如  Blog  实体可能如下:

复制

public partial class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
    public ICollection<Post> Posts { get; set; }
}
 
 
 Post  实体也会有相应属性,并且会自动配置与  Blog  的关联关系,类似:
 
public partial class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public int BlogId { get; set; }
    public virtual Blog Blog { get; set; }
}

四、总结

通过 EF Core 的数据库迁移功能,我们能以优雅的代码方式管理数据库架构变化,适应项目迭代需求。而从数据库表生成实体的逆向工程操作,则为对接已有数据库、快速构建数据访问层提供了高效途径。掌握这两项技术,能让.NET 开发者在数据库驱动的应用开发中如虎添翼,提升开发效率与代码质量,轻松应对复杂的数据持久化场景。

在实际项目中,可根据团队开发流程灵活运用,如在新项目启动时利用迁移创建初始架构,后期迭代持续更新;对接遗留数据库时,先逆向生成实体再按需优化调整,充分发挥 EF Core 的强大功能。

责任编辑:武晓燕 来源: 程序员编程日记
相关推荐

2021-08-10 07:57:57

k8s Nginx IngrNginx

2024-09-26 09:50:07

2022-04-07 10:17:18

云原生服务器优化

2023-03-06 07:19:50

2021-04-25 10:26:58

云计算云原生

2022-07-18 18:48:32

Kubernetes云原生

2023-03-03 07:54:21

2025-01-03 08:08:56

2012-01-10 14:35:08

JavaJVM

2022-11-08 08:55:31

2023-03-07 07:56:37

Sqoopk8s底层

2024-06-12 13:21:06

2022-10-14 07:42:50

LuceneHTTPWeb

2023-02-01 07:46:51

k8s云原生巧妙用法

2023-01-04 17:42:22

KubernetesK8s

2017-07-21 08:55:13

TomcatJVM容器

2021-09-01 09:50:02

K8S容器

2023-11-11 19:07:23

JVMJava

2021-08-13 07:00:41

云原生k8sspringboot

2021-08-26 07:20:05

云原生K8sSpringboot
点赞
收藏

51CTO技术栈公众号