Skip to main content

6 EF Core

数据库迁移指令

安装dotnet ef

dotnet tool install --global dotnet-ef

生成迁移代码

dotnet ef migrations add "迁移名称"

更新到数据库中

dotnet ef database update ["迁移名称(可选, 回滚到指定迁移处)"]

删除最后一次迁移脚本

dotnet ef migrations remove

生成SQL代码

dotnet ef migrations script "迁移名称(起始, 默认是第一次迁移)" "迁移名称(结束, 默认是最后一次迁移)"

批量修改/删除

Nuget 包: Zack.EFCore.Batch(.NET 7 之前, .NET 7 之后已支持批量修改/删除)

Fluent API

  • 视图与实体类映射(不推荐使用)
    • builder.ToView("blogsView")
  • 表与实体类映射
    • builder.ToTable("T_Books")
  • 排除属性映射
    • builder.Ignore(b => b.Name2)
  • 配置列名
    • builder.Property(b => b.BlogId).HasColumnName("blog_id")
  • 配置列数据类型
    • builder.Property(b => b.BlogId).HasColumnType("varchar(200)")
  • 配置最大长度
    • builder.Property(b => b.Name).HasMaxLength(20)
  • 配置不为空
    • builder.Property(b => b.BlogId).IsRequired()
  • 配置默认值
    • builder.Property(b => b.Name).HasDefaultValue("Def")
  • 配置主键
    • 默认把名字为 Id 或者"实体类型+Id"的属性作为主键, 可以用 HasKey() 来配置其它属性作为主键
    • builder.HasKey(b => b.Number)
    • 支持复合主键, 但不建议使用
  • 配置索引
    • builder.HasIndex(b => b.Url)
    • 支持复合索引, 如builder.HasIndex(b => new { b.FirstName, p.LastName } )
    • 默认情况下定义的索引不是唯一索引, 使用 IsUnique() 把索引设置为唯一索引
    • 还可以使用 IsClustered() 把索引设置为聚集索引

日志输出SQL语句

// 使用简单日志
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
  //...
  optionsBuilder.UseLoggerFactory(_loggerFactory);
  //...
}


// 使用日志框架
using Microsoft.Extensions.Logging;

private static ILoggerFactory _loggerFactory = LoggerFactory.Create(p => p.AddConsole());

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
  //...
  optionsBuilder.UseLoggerFactory(_loggerFactory);
  //...
}


// 使用 ToQueryString
var query = ctx.Persons.AsQueryable();
// ...进行筛选
...
// 获取SQL语句
query.ToQueryString();

一对多

.HasOne(...).WithMany(...)

WithMany(...) 传入参数之后, 属于双向导航属性

如果只想获得外键ID而不要使用 Join 来进行额外一次的查询, 使用 HasForeignKey(p => p.外键ID属性) 来指定外键ID字段

使用单向导航属性(WithMany 不传参数即可): HasOne(p => p.xxx).WithMany();


双向导航属性: 如文章表和评论表的主从表关系(文章表可以通过 Include() 查询出对应的评论列表, 评论表数据需要文章表的文章ID作为外键)

单向导航属性: 如用户表(基础表)和用户请假表的关系(用户表不需要知道用户请假表, 用户请假表需要有用户表的用户ID作为外键)


一对一

.HasOne(...).WithOne(...)

多对多

.HasMany(...).WithMany(...)