一、依赖和约束
1.1 安装NuGet包
- Micorsoft.EntityFrameworkCore.Tools:执行更新脚本。
- Pomelo.EntityFrameworkCore.MySql:MySQL在.NET Core的高效数据访问库
1.2 常用约定配置
EF Core使用了一套基于约定(Conventions)的机制来简化配置过程。这些约定帮助 EF Core 自动推断实体和数据库表之间的映射关系。优先级:Fluent API>Data Annotations(数据注释)>约定。
-
表名约定:采用DbContext的对应的DbSet属性名或[Table]注解。
-
主键约定: 默认识别 Id 或 <EntityName>Id。如果主键为short、int、long类型,则默认采用自增字段。
-
列名约定: 默认使用实体类的属性名作为列名。
二、 迁移(实体类映射到数据库)
2.1 创建实体类
public class Book
{
public long Id { get; set; }
public string Title { get; set; }
public DateTime PubTime { get; set; }
public double Price { get; set; }
}
public class Person
{
public long Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
2.2 添加配置类
添加配置类,继承IEntityTypeConfiguration接口,用于配置实体与数据库表之间的映射关系。
/// <summary>
/// 实体类配置。配置实体类和数据库表的映射关系
/// </summary>
public class BookConfig : IEntityTypeConfiguration<Book>
{
public void Configure(EntityTypeBuilder<Book> builder)
{
// 约定大于配置
// 1.配置表名为 T_Book
builder.ToTable("T_Book");
}
}
public class PersonConfig : IEntityTypeConfiguration<Person>
{
public void Configure(EntityTypeBuilder<Person> builder)
{
builder.ToTable("T_Person");
}
}
2.3 添加数据库上下文
数据库连接字符串格式String connectionString = "server=;database=;uid=;pwd=;";(注意:pwd后有分号)
server=
:数据库服务器的地址。如果是本地服务器,可以使用localhost
或者127.0.0.1
。如果数据库位于远程服务器,则需要填写该服务器的IP地址或域名。database=
:指定要连接的数据库名称。uid=
:访问数据库时使用的用户名。pwd=
:密码。
public class MyDbContext : DbContext
{
// DbSet指定 要映射到数据库的实体类
public DbSet<Book> Books { get; set; }
public DbSet<Person> Persons { get; set; }
/// <summary>
/// 配置数据库连接。
/// </summary>
/// <param name="optionsBuilder"></param>
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
// 1. 定义数据库连接字符串
String connectionString = "";
// 2. 指定数据库类型为 MySQL
optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString));
}
/// <summary>
/// 配置实体与数据库表之间的映射关系。
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 从当前程序集中读取所有的实体配置
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
}
2.4 迁移数据到数据库
- 打开程序包管理器控制台
- 迁移命令
Add-Migration Init:创建一个新的迁移。这里的"Init"是给这个迁移起的名字,通常用来描述这次迁移的目的或内容。初此执行将创建数据库和表,此后根据此后根据模型的变化来创建新的迁移文件。
Update-Database:更新数据库命令。将所有未应用的迁移应用到数据库中。当你第一次运行时,它会基于“Init”迁移创建整个数据库结构(执行Add-Migration Init不会创建数据库,只有执行Update-Database后才能看到数据库)。之后如果有新的迁移被添加,再次运行此命令会更新数据库以匹配模型的最新状态。
2.4 更新实体类
- 给Person类添加属性
- 迁移命令
Add-Migration AddBitrhToPerson:添加迁移。
Update-Database:更新数据库。
2.5 添加约束
在Book类添加AuthorName属性,在对应的配置类BookConfig添加约束:长度和是否为空
/// <summary>
/// 实体类配置。配置实体类和数据库表的映射关系
/// </summary>
public class BookConfig : IEntityTypeConfiguration<Book>
{
public void Configure(EntityTypeBuilder<Book> builder)
{
// 约定大于配置
// 1. 配置表名为 T_Book
builder.ToTable("T_Book");
// 2. 配置 Title 属性最大长度为 50,并且不能为空
builder.Property(b => b.Title).HasMaxLength(50).IsRequired();
// 3. 配置 Author 属性最大长度为 20,可以为空
builder.Property(b => b.AuthorName).HasMaxLength(20).IsRequired(false);
}
}
再次添加迁移和更新数据库
添加成功
三、反向工程
EFCore允许从现有的数据库生成实体类和 DbContext
1. PMC
Scaffold-DbContext "Your_Connection_String" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -Context YourDbContextName -f
"Your_Connection_String"
:替换为你的数据库连接字符串。Pomelo.EntityFrameworkCore.MySql
:指定使用的数据库提供程序。(Microsoft.EntityFrameworkCore.SqlServer)
-OutputDir Models
:指定生成的实体类存放的目录。-Context YourDbContextName
:指定生成的DbContext
的名字。-f
:强制覆盖已存在的文件。如果不加这个参数,且有同名文件存在,则命令会失败。
2. CLI
dotnet ef dbcontext scaffold "Your_Connection_String" Pomelo.EntityFrameworkCore.MySql --output-dir Models --context YourDbContextName --force
四、迁移命令汇总
功能 | PMC 命令 | .NET CLI 命令 |
---|---|---|
添加迁移 | Add-Migration <MigrationName> | dotnet ef migrations add <MigrationName> |
更新数据库 | Update-Database | dotnet ef database update |
列出所有迁移 | Get-Migrations | dotnet ef migrations list |
移除最新未应用的迁移 | Remove-Migration | dotnet ef migrations remove |
生成版本D到F的SQL脚本(不加路径只显示) | Script-Migration D F -Output "脚本文件路径" | dotnet ef migrations script D F --output "脚本文件路径" |
生成版本D到最新版本的SQL脚本 | Script-Migration D -Output "脚本文件路径" | dotnet ef migrations script D --output "脚本文件路径" |
删除数据库 | Drop-Database | dotnet ef database drop |
数据库回滚到XXX迁移 | Update-Database "XXX" | dotnet ef database update "XXX" |