提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、Entity Framework (EF) Core是什么?
Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术
EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:
a. 使 .NET 开发人员能够使用 .NET 对象处理数据库
b. 无需再像通常那样编写大部分数据访问代码
EF Core 支持多个数据库引擎,请参阅数据库提供程序了解详细信息
二、快速开始
1.获取包管理器控制台工具
安装 Microsoft.EntityFrameworkCore.Tools 包,ASP.NET Core 应用自动随附此包
2.为目标对象的 EF Core 数据库提供程序安装程序包
ps: 这里我使用的是 Npgsql (公司使用 postgresql 数据库)
包:Npgsql.EntityFrameworkCore.PostgreSQL
3.添加模型类和数据库上下文
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public BloggingContext(DbContextOptions<BloggingContext> options) : base(options)
{
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
public List<Post> Posts { get; } = new();
}
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public int BlogId { get; set; }
public Blog Blog { get; set; }
}
4.配置连接字符串
/5.连接字符串
"ConnectionStrings": {
"BloggingContext": "User ID=postgres;Password=root;Host=localhost;Port=5432;Database=EFCoreDemo;CommandTimeout=1024;MaxPoolSize=1024"
}
5.注册数据库上下文
//注册 BloggingContext
services.AddDbContext<BloggingContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("BloggingContext")));
6.使用迁移创建数据库
a.Add-Migration InitialDB 命令为迁移搭建基架,以便为模型创建一组初始表
b.Update-Database 命令创建数据库并向其应用新的迁移
7.添加控制器
8.启动项目
9.测试接口
提示:使用 postman 进行测试,数据库 id 自增,可以不传递 id
三、DbContext 说明
1.依赖注入
使用 Startup.cs 的 ConfigureServices 方法中的 AddDbContext 将 EF Core 添加配置
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options =>
options.UseNpgsql(Configuration.GetConnectionString("BloggingContext")));
}
然后在控制器中通过构造函数进行依赖注入
public class MyController
{
private readonly ApplicationDbContext _context;
public MyController(ApplicationDbContext context)
{
_context = context;
}
}
四、配置模型
1. 使用 fluent API 配置模型
a. 可在派生上下文中替代 OnModelCreating 方法,并使用 ModelBuilder API 来配置模型
b. 此配置方法最为有效,并可在不修改实体类的情况下指定配置
c. Fluent API 配置具有最高优先级,并将替代约定和数据注释(写在类上面的注释)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//给 Rating 列设置默认值
modelBuilder.Entity<Blog>()
.Property(b => b.Rating)
.HasDefaultValue(3);
}
tip: 需要更新迁移修改才生效
a. add-migration AddDefaultValue
b. update-database
tip: Migration 文件夹下生成的每次迁移,都是按照时间顺序排列的,所以你可以很方便的看到每一次对数据库结构做的修改信息
2. 分组配置
a. 为了减小 OnModelCreating 方法的大小,可以将实体类型的所有配置提取到实现 IEntityTypeConfiguration 的单独类中
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace EFCoreDemo.Models.Config
{
//Blog 类的配置类
public class BlogEntityTypeConfiguration : IEntityTypeConfiguration<Blog>
{
public void Configure(EntityTypeBuilder<Blog> builder)
{
//添加约束
builder
.Property(b => b.Url)
.IsRequired();
}
}
}
b. 然后,只需从 OnModelCreating 调用 Configure 方法
//将实体类型的所有配置提取到实现 IEntityTypeConfiguration<TEntity> 的单独类中
new BlogEntityTypeConfiguration().Configure(modelBuilder.Entity<Blog>());
c. 记得更新迁移,使得修改数据库操作生效 :
add-migration AddUrlRequired
update-database
3.使用数据注释来配置模型
tip: 数据注释可以应用于类和属性,但会被 Fluent API 配置替代,常用数据注释如下:
//使用数据注释
[Table("Blogs")]
[Comment("Blogs managed on the website")]
public class Blog
{
[Column("blog_id")]
//[Key] 将单个属性配置为实体的主键
//组合键只能使用 Fluent API 进行配置
public int BlogId { get; set; }
[Required]
[MaxLength(500)]
[Column(TypeName = "varchar(200)")]
public string Url { get; set; }
//[DefaultValue(5)]
public int Rating { get; set; }
//针对插入的实体生成其值
public DateTime Create { get; set; }
public List<Post> Posts { get; } = new();
}
tip: 记得更新迁移、更新数据库使之生效
4.日期时间
一个常见的请求是让数据库列包含第一次插入列的日期/时间(添加时生成的值)或上次更新列的日期/时间(添加或更新时生成的值)。 由于可通过各种策略执行此操作,因此 EF Core 提供程序通常不会为日期/时间列自动设置值生成 - 你必须自行配置
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.Property(b => b.Create)
.HasDefaultValueSql("CURRENT_DATE");
}
tip: 更新迁移、数据库。。。
tip: 上面的 CURRENT_DATE 方法是针对 postgresql 数据库的,其他类型数据库自行尝试
五、管理数据库架构
1. 迁移
在实际项目中,数据模型随着功能的实现而变化:添加和删除新的实体或属性,并且需要相应地更改数据库架构,使其与应用程序保持同步。 EF Core 中的迁移功能能够以递增方式更新数据库架构,使其与应用程序的数据模型保持同步,同时保留数据库中的现有数据
简要地说,迁移的方式如下:
a. 当引入数据模型更改时,开发人员使用 EF Core 工具添加相应的迁移,以描述使数据库架构保持同步所需的更新。EF Core 将当前模型与旧模型的快照进行比较,以确定差异,并生成迁移源文件;文件可在项目的源代码管理中进行跟踪
b. 生成新的迁移后,可通过多种方式将其应用于数据库。 EF Core 在一个特殊的历史记录表中记录所有应用的迁移,使其知道哪些迁移已应用,哪些迁移尚未应用
使用步骤:
a. 安装程序包管理器控制台工具:Microsoft.EntityFrameworkCore.Tools
b. 创建迁移:Add-Migration InitialCreate
c. 创建数据库和架构:Update-Database
d. 列出现有的所有迁移:Get-Migration
六、查询数据
1. LINQ
Entity Framework Core 使用语言集成查询 (LINQ) 来查询数据库中的数据。 通过 LINQ 可使用 C#(或你选择的其他 .NET 语言)编写强类型查询。 它使用你派生得到的上下文和实体类来引用数据库对象。 EF Core 将 LINQ 查询的表示形式传递给数据库提供程序。 反过来,数据库提供程序将其转换为数据库特定的查询语言(例如,用于关系数据库的 SQL)。 即使结果中返回的实体已存在于上下文中,也始终对数据库执行查询