目录

  1. 什么是 Entity Framework Core (EF Core)?
  2. 为什么使用 EF Core?
  3. 准备工作:安装环境
  4. 核心概念速览
  5. 实战演练:创建第一个 EF Core 应用
    • 步骤 1:创建新项目
    • 步骤 2:安装 EF Core NuGet 包
    • 步骤 3:定义数据模型 (Model)
    • 步骤 4:创建数据库上下文 (DbContext)
    • 步骤 5:配置数据库连接字符串
    • 步骤 6:使用 EF Core 迁移 创建数据库
    • 步骤 7:进行数据操作 (增删改查)
  6. 进阶主题简介
  7. 总结与学习资源

什么是 Entity Framework Core (EF Core)?

EF Core 是微软官方推出的、轻量级、可扩展、开源和跨平台的数据访问技术,它是一个 对象关系映射器

.net ef入门教程
(图片来源网络,侵删)

它的作用就是在你的 .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# 语法编写复杂的查询,代码更清晰、更易于维护。
  • 内置功能:提供了数据迁移、变更跟踪、并发控制等企业级功能。

准备工作:安装环境

在开始之前,请确保你的电脑上已安装:

  1. .NET SDK:推荐使用 .NET 6 或更高版本,你可以从 官网 下载并安装。
  2. 一个代码编辑器:强烈推荐 Visual Studio 2025Visual 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 数据库。

.net ef入门教程
(图片来源网络,侵删)

步骤 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

.net ef入门教程
(图片来源网络,侵删)
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() 虽然简单,但不适合生产环境,因为它无法处理数据库结构的更新。迁移 是更专业的做法。

  1. 初始化迁移: 在终端中运行以下命令,EF Core 会扫描你的 Model 变更,并创建一个“快照”文件。

    dotnet ef migrations add InitialCreate

    执行成功后,你会发现项目目录下多了一个 Migrations 文件夹,里面包含了生成的 C# 代码文件。

  2. 应用迁移: 将迁移应用到数据库,创建表结构。

    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 操作。

继续学习的资源:

保持好奇心,多动手实践,你很快就能成为 EF Core 的高手!