Entity Framework Core入门 #

一、EF Core概述 #

1.1 什么是EF Core #

Entity Framework Core是.NET的ORM框架,用于数据库操作。

1.2 特点 #

  • 跨平台
  • 轻量级
  • LINQ查询
  • 迁移支持
  • 多数据库支持

二、安装EF Core #

2.1 安装包 #

bash
dotnet add package Microsoft.EntityFrameworkCore
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools

2.2 其他数据库 #

bash
dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
dotnet add package Pomelo.EntityFrameworkCore.MySql

三、定义实体 #

3.1 实体类 #

csharp
public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public DateTime CreatedAt { get; set; }
    public ICollection<Order> Orders { get; set; }
}

public class Order
{
    public int Id { get; set; }
    public decimal Total { get; set; }
    public DateTime OrderDate { get; set; }
    public int UserId { get; set; }
    public User User { get; set; }
}

3.2 DbContext #

csharp
public class AppDbContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Order> Orders { get; set; }
    
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(u => u.Orders)
            .WithOne(o => o.User)
            .HasForeignKey(o => o.UserId);
    }
}

3.3 注册DbContext #

csharp
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

四、CRUD操作 #

4.1 创建 #

csharp
public async Task<User> CreateAsync(User user)
{
    _context.Users.Add(user);
    await _context.SaveChangesAsync();
    return user;
}

4.2 查询 #

csharp
public async Task<User?> GetByIdAsync(int id)
{
    return await _context.Users.FindAsync(id);
}

public async Task<List<User>> GetAllAsync()
{
    return await _context.Users.ToListAsync();
}

public async Task<User?> GetByEmailAsync(string email)
{
    return await _context.Users.FirstOrDefaultAsync(u => u.Email == email);
}

4.3 更新 #

csharp
public async Task UpdateAsync(User user)
{
    _context.Users.Update(user);
    await _context.SaveChangesAsync();
}

4.4 删除 #

csharp
public async Task DeleteAsync(int id)
{
    var user = await _context.Users.FindAsync(id);
    if (user != null)
    {
        _context.Users.Remove(user);
        await _context.SaveChangesAsync();
    }
}

五、迁移 #

5.1 创建迁移 #

bash
dotnet ef migrations add InitialCreate
dotnet ef migrations add AddUserEmail

5.2 应用迁移 #

bash
dotnet ef database update
dotnet ef database update AddUserEmail

5.3 回滚迁移 #

bash
dotnet ef database update PreviousMigration
dotnet ef migrations remove

5.4 生成SQL脚本 #

bash
dotnet ef migrations script
dotnet ef migrations script AddUserEmail

六、LINQ查询 #

6.1 基本查询 #

csharp
var users = await _context.Users
    .Where(u => u.Age > 18)
    .OrderBy(u => u.Name)
    .ToListAsync();

6.2 关联查询 #

csharp
var usersWithOrders = await _context.Users
    .Include(u => u.Orders)
    .ToListAsync();

var users = await _context.Users
    .Include(u => u.Orders.Where(o => o.Total > 100))
    .ToListAsync();

6.3 投影查询 #

csharp
var userDtos = await _context.Users
    .Select(u => new UserDto
    {
        Id = u.Id,
        Name = u.Name,
        OrderCount = u.Orders.Count
    })
    .ToListAsync();

6.4 分组查询 #

csharp
var orderCounts = await _context.Orders
    .GroupBy(o => o.UserId)
    .Select(g => new { UserId = g.Key, Count = g.Count() })
    .ToListAsync();

七、事务 #

7.1 使用事务 #

csharp
using var transaction = await _context.Database.BeginTransactionAsync();

try
{
    _context.Users.Add(user1);
    await _context.SaveChangesAsync();
    
    _context.Orders.Add(order1);
    await _context.SaveChangesAsync();
    
    await transaction.CommitAsync();
}
catch
{
    await transaction.RollbackAsync();
    throw;
}

八、总结 #

EF Core要点:

要点 说明
DbContext 数据库上下文
DbSet 实体集合
迁移 数据库版本控制
LINQ 查询语法
事务 原子操作

恭喜你完成了C#完全指南的学习!

最后更新:2026-03-26