你的想法很重要-大家都来谈 (C)Copyright 2012 by WeiPt

谈谈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 的场景:

  1. 业务逻辑复杂的应用

  2. 需要快速开发的项目

  3. 数据库结构频繁变更

  4. 团队熟悉 .NET 和 LINQ

不适合使用的场景:

  1. 对性能要求极高的系统

  2. 需要复杂 SQL 或数据库特性的项目

  3. 简单的 CRUD 应用(可考虑 Dapper)

  4. 已有成熟 SQL 代码需要复用

最佳实践:

  1. 对查询使用 AsNoTracking() 减少内存开销

  2. 合理使用 Include() 避免 N+1 问题

  3. 复杂查询考虑使用原始 SQL

  4. 定期分析生成的 SQL 语句

六、与 Dapper 对比

 
特性EF CoreDapper
性能 中等
开发效率 中等
学习曲线 较陡 平缓
灵活性 中等
迁移支持

推荐选择:对于大多数企业应用,EF Core 是很好的选择。对于性能关键模块,可混合使用 EF Core + Dapper。

 
 
posted @ 2026-01-15 09:38  weipt  阅读(0)  评论(0)    收藏  举报

你的想法很重要-大家都来谈 (C)Copyright 2012 by WeiPt