学海无涯

导航

统计

EF Core 迁移代码

列重命名

需要自定义迁移的一个重要示例就是重命名属性时。 例如,如果你将属性从 Name 重命名为 FullName,EF Core 将生成以下迁移:

1
2
3
4
5
6
7
8
migrationBuilder.DropColumn(
    name: "Name",
    table: "Customers");
 
migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customers",
    nullable: true);

  EF Core 通常无法知道何时要删除列并创建新列(两个不同的更改),何时应对列重命名。 如果按原样应用上述迁移,你的所有客户名称都将丢失。 若要重命名列,请将上面生成的迁移替换为以下内容:

1
2
3
4
migrationBuilder.RenameColumn(
    name: "Name",
    table: "Customers",
    newName: "FullName");

  

提示

当某个操作可能会导致数据丢失(例如删除某列),搭建迁移基架过程将对此发出警告。 如果看到此警告,务必检查迁移代码的准确性。

添加原始 SQL

虽然可以通过内置 API 重命名列,但在许多情况下这是不可能的。 例如,我们可能想用一个新的 FullName 属性替换现有的 FirstName 和 LastName 属性。 EF Core 生成的迁移如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");
 
migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");
 
migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);

  如前所述,这会导致不必要的数据丢失。 为了从旧列传输数据,我们重新排列迁移并引入原始 SQL 操作,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
migrationBuilder.AddColumn<string>(
    name: "FullName",
    table: "Customer",
    nullable: true);
 
migrationBuilder.Sql(
@"
    UPDATE Customer
    SET FullName = FirstName + ' ' + LastName;
");
 
migrationBuilder.DropColumn(
    name: "FirstName",
    table: "Customer");
 
migrationBuilder.DropColumn(
    name: "LastName",
    table: "Customer");

  

通过原始 SQL 进行任意更改

原始 SQL 还可用于管理 EF Core 不知道的数据库对象。 为此,请在不进行任何模型更改的情况下添加迁移;系统将生成一个空迁移,然后你可以使用原始 SQL 操作填充该迁移。

例如,以下迁移将创建一个 SQL Server 存储过程:

1
2
3
4
5
6
7
migrationBuilder.Sql(
@"
    EXEC ('CREATE PROCEDURE getFullName
        @LastName nvarchar(50),
        @FirstName nvarchar(50)
    AS
        RETURN @LastName + @FirstName;')");

  

 提示

当某个语句必须是 SQL 批处理中的第一个或唯一一个语句时,请使用 EXEC。 它还可以用来解决幂等迁移脚本中的分析程序错误,当表中当前不存在引用的列时,可能会发生此类错误。

这可用于管理数据库的方方面面,包括:

  • 存储过程
  • 全文搜索
  • 函数
  • 触发器
  • 视图

删除迁移

1
Remove-Migration 

列出迁移

1
Get-Migration

  

重置所有迁移

在某些极端情况下,可能需要删除所有迁移并重新开始。 这可以通过删除 Migrations 文件夹并删除数据库来轻松完成;此时,你可以创建一个新的初始迁移,其中将包含当前的整个架构。

你还可以重置所有迁移并创建单个迁移,而不会丢失数据。 此操作有时称为“更正”,涉及一些手动操作:

  • 删除 Migrations 文件夹
  • 创建新迁移并为其生成 SQL 脚本
  • 在数据库中,删除迁移历史记录表中的所有行
  • 在迁移历史记录中插入一行,以记录第一个迁移已经应用,因为表已经存在。 insert SQL 是上面生成的 SQL 脚本中的最后一个操作。

警告

删除 Migrations 文件夹后,所有自定义迁移代码都将丢失。 若要保留任何自定义项,必须手动将其应用到新的初始迁移。

posted on   宁静致远.  阅读(54)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2022-09-21 创建 Docker Compose 文件
2022-09-21 为后端 Web API 创建 Dockerfile
2022-09-21 Docker 镜像加速
点击右上角即可分享
微信分享提示