管理数据库
JeremyJone ... 2024-6-18 大约 1 分钟
# 管理数据库
# 迁移数据库
迁移数据库是将模型转换为数据库表。
前文 已经生成过数据库,通过下面命令:
dotnet ef migrations add InitialCreate
1
所以下面只介绍更新模型。
还是我们的 User
模型,它现在需要一个生日字段,那么我们就在 User
模型中添加一个生日字段:
public class User
{
/// <summary>
/// 用户 Id
/// </summary>
public int Id { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string Username { get; set; }
/// <summary>
/// 用户昵称
/// </summary>
public string Nickname { get; set; }
/// <summary>
/// 用户所在部门
/// </summary>
public int DepartmentId { get; set; }
/// <summary>
/// 用户的生日
/// </summary>
public DateTime BirthDate { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
模型更新好了,就可以开始更新数据库:
dotnet ef migrations add AddUserBirthDate
dotnet ef database udpate
1
2
2
EF Core 会在添加列之前将更新的模型与旧模型的快照进行比较,快照是迁移时生成的文件之一,并签入到源代码管理中。基于比较,EF Core 会检测到添加一列,并添加适当的迁移。
# 反向工程
反向工程是基架实体类型类的过程,通过 Scaffold-DbContext
或者 dotnet ef dbcontext scaffold
命令来完成。
Scaffold-DbContext '连接字符串' 框架名
1
此外,还可以有如下参数:
-OutputDir 输出文件名
: 反向工程生成模型的输出目录-ContextDir 上下文文件夹
: 将DbContext
类生成到单独文件夹-Tables 表名
: 指定哪些表进行反向工程-Force
: 强制覆盖已存在文件
比如如下示例:
# SqlServer
Scaffold-DbContext 'Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Chinook' Microsoft.EntityFrameworkCore.SqlServer
# MySQL
Scaffold-DbContext "server=localhost;userid=jeremyjone;pwd=123;port=3306;database=db1;" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Force
1
2
3
4
5
2
3
4
5