谈谈EF Core 微软官方的 ORM(对象关系映射)框架
Microsoft.EntityFrameworkCore(简称 EF Core)是微软官方的 ORM(对象关系映射)框架,以下是其核心用法、优点和缺点:
一、基本用法
1. DbContext 定义
csharp
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Order> Orders { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
{
options.UseSqlServer("ConnectionString");
}
}
2. 实体配置
csharp
// 数据注解方式
public class User
{
[Key]
public int Id { get; set; }
[Required, MaxLength(100)]
public string Name { get; set; }
[Column("email_address")]
public string Email { get; set; }
}
// Fluent API 方式(在 DbContext 中)
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasKey(u => u.Id);
modelBuilder.Entity<User>()
.Property(u => u.Name)
.IsRequired()
.HasMaxLength(100);
}
3. 基本 CRUD 操作
csharp
// 新增
var user = new User { Name = "John" };
context.Users.Add(user);
await context.SaveChangesAsync();
// 查询
var users = await context.Users
.Where(u => u.Name.Contains("John"))
.ToListAsync();
// 更新
var user = await context.Users.FindAsync(1);
user.Name = "Updated";
await context.SaveChangesAsync();
// 删除
context.Users.Remove(user);
await context.SaveChangesAsync();
4. 迁移管理
bash
# 创建迁移
dotnet ef migrations add InitialCreate
# 更新数据库
dotnet ef database update
# 脚本生成
dotnet ef migrations script
二、高级特性
1. LINQ 查询
csharp
var result = await context.Orders
.Include(o => o.User) // 贪婪加载
.Where(o => o.Total > 100)
.Select(o => new {
o.Id,
UserName = o.User.Name,
o.Total
})
.ToListAsync();
2. 事务管理
csharp
using var transaction = await context.Database.BeginTransactionAsync();
try
{
// 多个操作
await context.SaveChangesAsync();
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
}
3. 性能优化
csharp
// AsNoTracking 查询
var users = await context.Users
.AsNoTracking()
.ToListAsync();
// 批量操作(EF Core 7+)
await context.Users
.Where(u => u.IsActive)
.ExecuteUpdateAsync(u => u.SetProperty(x => x.LastLogin, DateTime.Now));
三、主要优点
1. 开发效率高
-
自动生成 SQL,减少手写 SQL 工作量
-
强类型 LINQ 查询,编译时检查
-
Code First 模式支持快速迭代
2. 平台支持广泛
-
支持 SQL Server、PostgreSQL、MySQL、SQLite 等
-
跨平台(.NET Core/.NET 5+)
3. 功能丰富
-
迁移管理(Migration)
-
变更跟踪(Change Tracking)
-
延迟加载(Lazy Loading)
-
并发控制(Concurrency Control)
4. 集成良好
-
与 ASP.NET Core 深度集成
-
依赖注入支持
-
配合 LINQ 提供强大查询能力
四、主要缺点
1. 性能问题
-
复杂查询可能生成低效 SQL
-
大量数据操作时性能不如 Dapper
-
N+1 查询问题需要手动优化
2. 学习曲线
-
配置选项繁多
-
性能调优需要深入理解
-
迁移管理有一定复杂度
3. 灵活性受限
-
复杂 SQL 难以表达
-
某些数据库特性支持有限
-
存储过程支持不如原生 ADO.NET
4. 调试困难
-
生成的 SQL 不易调试
-
性能问题定位复杂
-
某些错误信息不够直观
五、使用建议
适合使用 EF Core 的场景:
-
业务逻辑复杂的应用
-
需要快速开发的项目
-
数据库结构频繁变更
-
团队熟悉 .NET 和 LINQ
不适合使用的场景:
-
对性能要求极高的系统
-
需要复杂 SQL 或数据库特性的项目
-
简单的 CRUD 应用(可考虑 Dapper)
-
已有成熟 SQL 代码需要复用
最佳实践:
-
对查询使用
AsNoTracking()减少内存开销 -
合理使用
Include()避免 N+1 问题 -
复杂查询考虑使用原始 SQL
-
定期分析生成的 SQL 语句
六、与 Dapper 对比
| 特性 | EF Core | Dapper |
|---|---|---|
| 性能 | 中等 | 高 |
| 开发效率 | 高 | 中等 |
| 学习曲线 | 较陡 | 平缓 |
| 灵活性 | 中等 | 高 |
| 迁移支持 | 有 | 无 |
推荐选择:对于大多数企业应用,EF Core 是很好的选择。对于性能关键模块,可混合使用 EF Core + Dapper。

浙公网安备 33010602011771号