目录
- 什么是 Entity Framework Core (EF Core)?
- 为什么使用 EF Core?
- 准备工作:安装环境
- 核心概念速览
- 实战演练:创建第一个 EF Core 应用
- 步骤 1:创建新项目
- 步骤 2:安装 EF Core NuGet 包
- 步骤 3:定义数据模型 (Model)
- 步骤 4:创建数据库上下文 (DbContext)
- 步骤 5:配置数据库连接字符串
- 步骤 6:使用 EF Core 迁移 创建数据库
- 步骤 7:进行数据操作 (增删改查)
- 进阶主题简介
- 总结与学习资源
什么是 Entity Framework Core (EF Core)?
EF Core 是微软官方推出的、轻量级、可扩展、开源和跨平台的数据访问技术,它是一个 对象关系映射器。

它的作用就是在你的 .NET 对象(C# 类)和数据库表之间建立一个桥梁。
- 传统方式:你需要手写 SQL 语句 (
SELECT * FROM Users WHERE Id = 1),然后将查询结果手动映射到 C# 对象上,这个过程繁琐且容易出错。 - EF Core 方式:你只需要操作 C# 对象 (
context.Users.Find(1)),EF Core 会自动帮你生成并执行相应的 SQL 语句,并将结果转换回 C# 对象。
为什么使用 EF Core?
- 提高开发效率:无需编写和维护大量重复的 SQL 代码,专注于业务逻辑。
- 减少错误:避免了手写 SQL 时可能出现的语法错误和逻辑错误。
- 数据库无关性:你可以通过更换 EF Core 的“数据库提供程序”,轻松地将你的应用程序从 SQL Server 切换到 PostgreSQL、SQLite、MySQL 等,而大部分业务代码无需改动。
- 强大的查询能力:支持 LINQ (Language Integrated Query),可以用 C# 语法编写复杂的查询,代码更清晰、更易于维护。
- 内置功能:提供了数据迁移、变更跟踪、并发控制等企业级功能。
准备工作:安装环境
在开始之前,请确保你的电脑上已安装:
- .NET SDK:推荐使用 .NET 6 或更高版本,你可以从 官网 下载并安装。
- 一个代码编辑器:强烈推荐 Visual Studio 2025 或 Visual Studio Code,本教程将以 VS Code 为例进行演示。
核心概念速览
在动手之前,先了解几个核心概念,会让你事半功倍。
- Model (模型):一个普通的 C# 类,用于表示数据库中的表。
User类对应Users表,Product类对应Products表,类的属性(Property)对应表的列(Column)。 - DbContext (数据库上下文):这是 EF Core 的核心,它是一个类,继承自
Microsoft.EntityFrameworkCore.DbContext,它负责:- 定义你的数据模型(通过
DbSet<T>属性)。 - 协调与数据库的交互(连接、执行命令、保存更改等)。
- 跟踪哪些对象发生了变化,以便在调用
SaveChanges()时生成正确的 SQL。
- 定义你的数据模型(通过
- DbSet (数据集):在
DbContext中定义的DbSet<T>属性代表数据库中的一个表。public DbSet<User> Users { get; set; }就代表Users表。 - Migration (迁移):当你修改了 Model(比如添加了一个新属性、删除一个类)后,数据库的结构也需要相应改变,迁移功能可以帮助你将这些 Model 的变更,自动生成和应用到数据库中,创建或更新数据库架构。
- Provider (数据库提供程序):这是一个桥梁,让 EF Core 能够与特定类型的数据库通信。
Microsoft.EntityFrameworkCore.SqlServer用于 SQL Server,Microsoft.EntityFrameworkCore.Sqlite用于 SQLite。
实战演练:创建第一个 EF Core 应用
我们将创建一个控制台应用程序,使用 EF Core Core 来管理一个简单的 Blog 数据库。

步骤 1:创建新项目
打开终端或命令提示符,运行以下命令:
# 创建一个新的控制台应用 dotnet new console -n EfCoreGettingStarted # 进入项目目录 cd EfCoreGettingStarted
步骤 2:安装 EF Core NuGet 包
我们需要安装 EF Core 核心包和用于 SQLite 的数据库提供程序,SQLite 是一个轻量级的文件数据库,非常适合入门和本地开发。
# 安装 EF Core 核心包 dotnet add package Microsoft.EntityFrameworkCore # 安装 SQLite 数据库提供程序 dotnet add package Microsoft.EntityFrameworkCore.Sqlite
步骤 3:定义数据模型
在项目中创建一个名为 Models 的新文件夹,并在其中创建一个 Blog.cs 文件。
Models/Blog.cs

using System.ComponentModel.DataAnnotations; // 用于数据验证特性
namespace EfCoreGettingStarted.Models
{
public class Blog
{
public int Id { get; set; } // 主键,EF Core 会自动识别
[Required] // 声明此字段不能为空
[StringLength(100)] // 声明此字段最大长度为100
public string Name { get; set; }
public string Url { get; set; }
// 导航属性:一个 Blog 可以有多个 Posts
public List<Post> Posts { get; set; }
}
}
我们再创建一个 Post.cs 模型来演示一对多关系。
Models/Post.cs
namespace EfCoreGettingStarted.Models
{
public class Post
{
public int Id { get; set; }
[Required]
public string Title { get; set; }
public string Content { get; set; }
// 外键:Post 属于哪个 Blog
public int BlogId { get; set; }
// 导航属性:一个 Post 属于一个 Blog
public Blog Blog { get; set; }
}
}
步骤 4:创建数据库上下文
创建一个名为 Data 的新文件夹,并在其中创建一个 BloggingDbContext.cs 文件。
Data/BloggingDbContext.cs
using Microsoft.EntityFrameworkCore; // 引入 EF Core 命名空间
using EfCoreGettingStarted.Models; // 引入我们的模型命名空间
namespace EfCoreGettingStarted.Data
{
public class BloggingDbContext : DbContext
{
// 构造函数,接收 DbContextOptions
public BloggingDbContext(DbContextOptions<BloggingDbContext> options) : base(options)
{
}
// 定义 DbSet 属性,它们代表数据库中的表
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
}
步骤 5:配置数据库连接字符串
打开 Program.cs 文件,我们将在这里配置应用程序和 EF Core。
Program.cs
using Microsoft.EntityFrameworkCore; // 引入 EF Core 命名空间
using EfCoreGettingStarted.Data; // 引入我们的 DbContext 命名空间
// ... (其他 using 语句)
// 1. 创建一个 SQLite 数据库连接
// 这会在项目根目录下创建一个 "blogging.db" 文件
var connectionString = "Data Source=blogging.db";
// 2. 配置 DbContext 选项
// 告诉 EF Core 使用 SQLite 数据库提供程序,并指定连接字符串
var optionsBuilder = new DbContextOptionsBuilder<BloggingDbContext>();
optionsBuilder.UseSqlite(connectionString);
// 3. 创建 DbContext 实例
// 这是 EF Core 与数据库交互的入口点
using var dbContext = new BloggingDbContext(optionsBuilder.Options);
// 4. (可选) 在第一次运行时检查数据库是否已创建
// Model 发生变化,你需要使用迁移来更新数据库
// 这行代码只检查表是否存在,不会创建新表或更新表结构
// dbContext.Database.EnsureCreated();
// 注意:在生产环境中,推荐使用迁移 (Migrations) 来管理数据库结构。
Console.WriteLine("DbContext 已准备就绪!");
步骤 6:使用 EF Core 迁移 创建数据库
EnsureCreated() 虽然简单,但不适合生产环境,因为它无法处理数据库结构的更新。迁移 是更专业的做法。
-
初始化迁移: 在终端中运行以下命令,EF Core 会扫描你的 Model 变更,并创建一个“快照”文件。
dotnet ef migrations add InitialCreate
执行成功后,你会发现项目目录下多了一个
Migrations文件夹,里面包含了生成的 C# 代码文件。 -
应用迁移: 将迁移应用到数据库,创建表结构。
dotnet ef database update
执行后,回到项目根目录,你会发现一个
blogging.db文件被创建了,恭喜你,数据库和表已经自动生成好了!
步骤 7:进行数据操作 (增删改查 - CRUD)
我们可以在 Program.cs 中编写代码来操作数据库了,我们使用 using var dbContext = ... 的方式,可以确保在代码块结束后,数据库连接会被自动关闭。
完整的 Program.cs
using Microsoft.EntityFrameworkCore;
using EfCoreGettingStarted.Data;
using EfCoreGettingStarted.Models;
// --- 1. 配置 DbContext ---
var connectionString = "Data Source=blogging.db";
var optionsBuilder = new DbContextOptionsBuilder<BloggingDbContext>();
optionsBuilder.UseSqlite(connectionString);
// 使用 'using' 确保资源被正确释放
using var dbContext = new BloggingDbContext(optionsBuilder.Options);
// --- 2. 应用迁移 (确保数据库是最新的) ---
// 注意:在应用程序启动时执行一次即可
dbContext.Database.Migrate(); // 这比 database update 更灵活,可以处理多个待应用的迁移
Console.WriteLine("数据库已准备就绪!");
// --- 3. 数据操作 ---
// (C)reate - 创建 (添加)
Console.WriteLine("\n--- 创建新博客 ---");
var newBlog = new Blog { Name = "The .NET Blog", Url = "https://dotnet.microsoft.com/blog" };
dbContext.Blogs.Add(newBlog);
dbContext.SaveChanges(); // 保存更改到数据库
Console.WriteLine($"已创建新博客,ID: {newBlog.Id}");
// (R)ead - 查询
Console.WriteLine("\n--- 查询所有博客 ---");
var blogs = dbContext.Blogs.ToList(); // 将所有博客查询到内存中
foreach (var blog in blogs)
{
Console.WriteLine($"ID: {blog.Id}, Name: {blog.Name}");
}
// (U)pdate - 更新
Console.WriteLine("\n--- 更新博客名称 ---");
var blogToUpdate = dbContext.Blogs.FirstOrDefault(b => b.Name == "The .NET Blog");
if (blogToUpdate != null)
{
blogToUpdate.Name = "The Official .NET Blog";
dbContext.SaveChanges(); // 再次保存更改
Console.WriteLine($"已更新博客 ID {blogToUpdate.Id} 的名称。");
}
// (D)elete - 删除
Console.WriteLine("\n--- 删除博客 ---");
var blogToDelete = dbContext.Blogs.FirstOrDefault(b => b.Name == "The Official .NET Blog");
if (blogToDelete != null)
{
dbContext.Blogs.Remove(blogToDelete); // 标记为删除
dbContext.SaveChanges(); // 保存更改,执行 DELETE 语句
Console.WriteLine($"已删除博客 ID {blogToDelete.Id}。");
}
Console.WriteLine("\n--- 最终查询 ---");
var finalBlogs = dbContext.Blogs.ToList();
foreach (var blog in finalBlogs)
{
Console.WriteLine($"ID: {blog.Id}, Name: {blog.Name}");
}
运行你的应用程序 (dotnet run),你将在控制台看到完整的 CRUD 操作输出。
进阶主题简介
当你掌握了基础后,可以探索以下更高级的主题:
- 关系配置:使用 Fluent API 或 Data Annotations 更精细地控制模型之间的关系(一对一、一对多、多对多)。
- 异步操作:所有数据库操作都提供了异步版本(如
SaveChangesAsync()),避免阻塞主线程,对 Web 应用至关重要。 - 查询:深入学习 LINQ 查询,包括
Where,OrderBy,GroupBy,Join等,以及如何生成高效的 SQL。 - 变更追踪:了解 EF Core 如何跟踪对象状态,以及如何手动控制它。
- 依赖注入:在更复杂的应用(如 ASP.NET Core)中,通常将
DbContext注册为服务,并通过构造函数注入使用,而不是像本教程中这样手动创建。
总结与学习资源
恭喜!你已经完成了 .NET EF Core 的入门之旅,现在你应该知道了:
- EF Core 是什么,以及它的核心优势。
- Model, DbContext, DbSet, Migration 等关键概念。
- 如何从头开始搭建一个 EF Core 项目,并完成基本的 CRUD 操作。
继续学习的资源:
- 官方文档 (首选):Entity Framework Core 文档 - 这是最权威、最全面的学习资料。
- GitHub 源码:Entity Framework Core GitHub
- 视频教程:在 YouTube、Bilibili 等平台搜索 "EF Core Tutorial",有大量高质量的免费视频教程。
保持好奇心,多动手实践,你很快就能成为 EF Core 的高手!
