前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Entity Framework Core-Migrations

Entity Framework Core-Migrations

作者头像
郑子铭
发布2023-08-29 09:15:15
2640
发布2023-08-29 09:15:15
举报

使用EF Core Migrations可以使Entity & DbContext的配置与数据库保持一致,Migrations可以非常容易的将创建和更新数据库,当一个项目在开发过程中时,程序员能保证实体更新,因此他们需要运行Migration保证数据库是最新

1 如何运行Migrations

在Package Manager Console中运行EF Core Migrations,

我们可以使用.NET Core command-line interface(CLI)或者Package Manager Console (PMC)的任何一个工具来做迁移

运行下面命令安装CLI Tools

代码语言:javascript
复制
dotnet tool install --global dotnet-ef

如果你已经安装了,运行下面命令更新到最新版本

代码语言:javascript
复制
dotnet tool update --global dotnet-ef

运行下面命令安装PMC工具

代码语言:javascript
复制
Install-Package Microsoft.EntityFrameworkCore.Tools

接下来我们看一下迁移命令

2 Add Migration 命令

Add Migration命令将创建迁移文件,你的DbContext和Entity 将存储到该文件夹下,在Tools->NuGet Package Manager->Package Manager Console 执行下面两个命令中的任何一个来创建迁移文件:

代码语言:javascript
复制
PM> dotnet ef migrations add Migration1

或者

代码语言:javascript
复制
PM> add-migration Migration1

这里migration名称是Migration1,你可以叫个自己喜欢的名字,migration命令将在应用程序根目录下创建一个Migrations文件夹,这个文件夹下包含3个文件:

_.cs:主要migration文件,包含migration操作Up()和Down()方法, Up方法负责创建DB对象,Down方法移除他们

_.Designer.cs:migration元数据文件包含DB关联的信息

ModelSnapshot.cs:当前模型的快照,用于确定在创建下一次迁移时发生了什么变化

3 Update Migration 命令

Update Migration 命令将最新的迁移更新到数据库,如果数据库不存在,他将创建一个新的数据库,如果存在,会根据给予的迁移文件进行更新数据库

我们能运行下面2个命令的任何一个来更新数据库:

代码语言:javascript
复制
PM> dotnet ef database update

或者

代码语言:javascript
复制
PM> Update-Database

每次migration更新结束,我们会发现创建了一个新的数据库,数据库中有个表叫_EFMigrationsHistory ,该表存储了所有提交的migrations名称

4 使用 –context 关键字

如果应用程序有多个Database Context文件,可以使用–context关键字指定DbContext文件迁移目标,我们可以指定migration目标是EmployeeContext.cs

代码语言:javascript
复制
PM> dotnet ef migrations add Migration1 --context EmployeeContext
PM> dotnet ef database update --context EmployeeDbContext

5 回退数据库

使用EF Core回退数据库是非常容易的,让我们看一个例子,我们前面有个Client实体类并且我们有个数据库已经包含了"Client"表:

代码语言:javascript
复制
public class Client
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public string TelephoneNo { get; set; }
    public string Email { get; set; }  
}

假如,我们决定在属性类中添加一个"Address" 属性:

代码语言:javascript
复制
public string Address { get; set; }

使用EF Core Migration将字段更新到Client表中

代码语言:javascript
复制
PM> dotnet ef migrations add Migration1
PM> dotnet ef database update

我们在数据库Client表中获取到了刚才添加的address字段

假如一些特殊情况下,我们需要将数据库回退到之前的版本状态,当客户端表不需要Address字段时,我们需要移除Address属性在Client表中,执行如下命令

代码语言:javascript
复制
PM> dotnet ef database update 20230410151307_migrations
PM> dotnet ef migrations remove

6 Remove Migration 命令

如果没有提交数据库可以使用Remove Migration 命令来移除最新的migration,我们移除之后的migration如果没有提交到数据库,针对这个我们能执行下面两个命令其中的任何一个:

代码语言:javascript
复制
PM> dotnet ef migrations remove
or
PM> remove-migration

如果migration 已经提交到数据库,我们将会收到下面错误

7 删除数据库

使用下面任何一个命令来删除数据库

代码语言:javascript
复制
PM> dotnet ef database drop

或者

代码语言:javascript
复制
PM> Drop-Database

8 生成SQL 脚本

我们也能生成SQL 数据库的SQL脚本,执行下面2个命令中的任何一个来完成这个工作:

代码语言:javascript
复制
PM> dotnet ef migrations script
代码语言:javascript
复制
PM> script-migration

这个命令将会针对所有的migrations生成一个脚本,如果我们有这个需求,我们可以使用这个脚本生成一个数据库的副本

代码语言:javascript
复制
PM> dotnet ef migrations script
Build started...
Build succeeded.
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
    CREATE TABLE [__EFMigrationsHistory] (
        [MigrationId] nvarchar(150) NOT NULL,
        [ProductVersion] nvarchar(32) NOT NULL,
        CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
    );
END;
GO

BEGIN TRANSACTION;
GO

CREATE TABLE [Clients] (
    [Id] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NOT NULL,
    [Country] nvarchar(max) NOT NULL,
    [TelephoneNo] nvarchar(max) NOT NULL,
    [Email] nvarchar(max) NOT NULL,
    CONSTRAINT [PK_Clients] PRIMARY KEY ([Id])
);
GO

INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20230410151307_migrations', N'7.0.4');
GO

COMMIT;
GO

BEGIN TRANSACTION;
GO

ALTER TABLE [Clients] ADD [Address] nvarchar(max) NOT NULL DEFAULT N'';
GO

INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20230410151612_migrations1', N'7.0.4');
GO

COMMIT;
GO

BEGIN TRANSACTION;
GO

INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20230410151721_migrations2', N'7.0.4');
GO

COMMIT;
GO

PM>

总结

这节我们主要学习了Entity Frame Core Migrations常用的相关命令

源代码地址:

https://github.com/bingbing-gui/Asp.Net-Core-Skill/tree/master/EntityFrameworkCore/EFCoreMigration

参考资料

https://learn.microsoft.com/en-us/ef/core/managing-schemas/migrations/?tabs=dotnet-core-cli

https://www.yogihosting.com/migrations-entity-framework-core/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2 Add Migration 命令
  • 3 Update Migration 命令
    • 4 使用 –context 关键字
    • 5 回退数据库
    • 6 Remove Migration 命令
    相关产品与服务
    数据库
    云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档