Entity Framework Core 系列教程
1. EF Core 基础:使用代码优先(Code-First)进行数据库设计
引言
Entity Framework Core (EF Core) 是一个强大的ORM工具,允许开发者通过编写C#代码定义数据模型,然后EF Core会根据这些模型生成数据库架构。本文将介绍如何使用代码优先(Code-First)方法进行数据库设计,适合初学者入门。
数据模型定义
-
创建ASP.NET Core项目:
- 打开Visual Studio 2022,选择“创建一个新项目”。
- 选择“ASP.NET Core Web API”模板,然后点击“下一步”。
- 命名项目为
EFCoreDemo
,选择保存位置并点击“创建”。 - 在“附加信息”对话框中,选择“.NET 6.0”或更高版本,点击“创建”。
-
添加数据模型类:
- 在“解决方案资源管理器”中,右键点击项目名称,选择“添加 > 新建文件夹”,命名为
Models
。 - 右键
Models
文件夹,选择“添加 > 类”,创建一个名为User.cs
的类。
public class User { public int Id { get; set; } public string Username { get; set; } public string Email { get; set; } public ICollection<BlogPost> BlogPosts { get; set; } }
- 同样方式,添加一个名为
BlogPost.cs
的类:
public class BlogPost { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } public DateTime CreatedAt { get; set; } public int UserId { get; set; } public User User { get; set; } }
- 在“解决方案资源管理器”中,右键点击项目名称,选择“添加 > 新建文件夹”,命名为
配置数据库上下文
-
创建数据库上下文类:
- 右键项目名称,选择“添加 > 新建文件夹”,命名为
Data
。 - 右键
Data
文件夹,选择“添加 > 类”,命名为BlogContext.cs
。
using Microsoft.EntityFrameworkCore; using EFCoreDemo.Models; public class BlogContext : DbContext { public DbSet<User> Users { get; set; } public DbSet<BlogPost> BlogPosts { get; set; } public BlogContext(DbContextOptions<BlogContext> options) : base(options) { } }
- 右键项目名称,选择“添加 > 新建文件夹”,命名为
-
配置数据库连接字符串:
- 打开
appsettings.json
文件,添加连接字符串配置:
"ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=BlogDb;Trusted_Connection=True;" }
- 打开
-
在
Program.cs
中配置服务:builder.Services.AddDbContext<BlogContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
2. 数据库迁移:如何在EF Core中管理数据库迁移
引言
EF Core的迁移功能使得数据库的创建和修改变得容易。使用Visual Studio的工具,我们可以轻松管理数据库的演进。
创建和应用迁移
-
在Visual Studio中添加迁移:
- 打开“解决方案资源管理器”,右键项目名称,选择“工具 > NuGet 包管理器 > 包管理器控制台”。
- 在“包管理器控制台”中,选择项目的默认项目为
EFCoreDemo
。 - 输入命令
Add-Migration InitialCreate
并按回车键执行(无需手动输入)。
-
更新数据库:
- 在包管理器控制台中,输入
Update-Database
并按回车键执行。
- 在包管理器控制台中,输入
这些操作将创建数据库和初始表结构。
管理数据库迁移
假设我们需要在BlogPost
模型中添加一个新属性Summary
,首先在BlogPost
类中添加新属性:
public string Summary { get; set; }
然后在Visual Studio中执行以下步骤:
-
添加迁移:
- 再次打开包管理器控制台,输入
Add-Migration AddSummaryToBlogPost
。
- 再次打开包管理器控制台,输入
-
更新数据库:
- 输入
Update-Database
以应用变更。
- 输入
3. 使用EF Core实现复杂查询和关系映射
引言
EF Core不仅支持简单的CRUD操作,还可以执行复杂的查询和处理实体之间的关系。下面展示如何使用EF Core进行复杂查询和关系映射。
查询过滤与排序
-
查询最新的博客文章:
var recentPosts = context.BlogPosts .Where(p => p.CreatedAt > DateTime.Now.AddDays(-7)) .OrderByDescending(p => p.CreatedAt) .ToList();
关系映射
EF Core支持多种关系映射,如一对多、一对一、多对多。我们通过Include
方法加载相关实体:
var usersWithPosts = context.Users
.Include(u => u.BlogPosts)
.ToList();
4. 如何优化EF Core的性能:延迟加载与跟踪行为
延迟加载
延迟加载可以在需要时才加载相关实体,从而提高性能:
-
启用延迟加载:
- 在
Program.cs
中配置EF Core:
builder.Services.AddDbContext<BlogContext>(options => options.UseLazyLoadingProxies().UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
- 在
-
在模型类中启用延迟加载:
public virtual ICollection<BlogPost> BlogPosts { get; set; }
禁用更改跟踪
在只读操作中,可以禁用EF Core的更改跟踪来提高查询性能:
var posts = context.BlogPosts.AsNoTracking().ToList();
5. 使用 Fluent API 进行高级模型配置
引言
使用Fluent API,开发者可以在代码中定义更加复杂的数据库映射和配置。
配置复合键与表名
通过OnModelCreating
方法配置复杂的模型关系和自定义表名:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<BlogPost>()
.HasKey(p => new { p.Id, p.UserId });
modelBuilder.Entity<BlogPost>()
.ToTable("Posts");
}
6. 在EF Core中处理并发冲突
引言
在并发场景中,多个用户可能同时更新同一条记录。EF Core提供了并发控制功能,防止数据冲突。
使用并发标记
通过添加并发标记属性,EF Core可以检测并发冲突:
public class BlogPost
{
public byte[] RowVersion { get; set; }
}
处理并发异常
在SaveChanges
时捕获并处理并发冲突:
try
{
context.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
// 处理并发冲突
}
总结
本文系列通过Visual Studio 2022的图形界面,详细介绍了EF Core从基础到高级的各类操作,包括代码优先数据库设计、迁移管理、复杂查询、性能优化、Fluent API配置以及并发冲突的处理。这些内容不仅适合初学者学习,也为进阶用户提供了深入的技术指导。