第八章 数据访问和Entity Framework

8.1 Entity Framework Core介绍

什么是Entity Framework Core

Entity Framework Core (EF Core) 是一个现代的对象关系映射(ORM)框架,允许.NET开发者使用.NET对象处理数据库。它支持多种数据库提供程序,包括SQL Server、PostgreSQL、SQLite、MySQL等。

核心概念

  1. DbContext:表示数据库会话,负责查询和保存数据
  2. 实体(Entities):表示数据库表的.NET类
  3. DbSet:表示数据库中特定类型的实体集合
  4. 迁移(Migrations):用于创建和修改数据库架构的方式

8.2 配置Entity Framework

安装必需的包

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

创建数据模型

public class TodoItem
{
    public long Id { get; set; }
    public string? Name { get; set; }
    public bool IsComplete { get; set; }
    public DateTime CreatedDate { get; set; }
}

public class TodoContext : DbContext
{
    public TodoContext(DbContextOptions<TodoContext> options)
        : base(options)
    {
    }

    public DbSet<TodoItem> TodoItems { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TodoItem>(entity =>
        {
            entity.HasKey(e => e.Id);
            entity.Property(e => e.Name).IsRequired().HasMaxLength(200);
            entity.Property(e => e.CreatedDate).HasDefaultValueSql("GETDATE()");
        });
    }
}

注册DbContext

// 在Program.cs中
builder.Services.AddDbContext<TodoContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

8.3 数据库迁移

创建和应用迁移

# 创建初始迁移
dotnet ef migrations add InitialCreate

# 更新数据库
dotnet ef database update

# 添加新迁移
dotnet ef migrations add AddCreatedDate

# 回滚迁移
dotnet ef database update PreviousMigrationName

8.4 仓储模式

实现仓储接口

public interface ITodoRepository
{
    Task<IEnumerable<TodoItem>> GetAllAsync();
    Task<TodoItem> GetByIdAsync(long id);
    Task<TodoItem> AddAsync(TodoItem todoItem);
    Task UpdateAsync(TodoItem todoItem);
    Task DeleteAsync(long id);
}

public class TodoRepository : ITodoRepository
{
    private readonly TodoContext _context;

    public TodoRepository(TodoContext context)
    {
        _context = context;
    }

    public async Task<IEnumerable<TodoItem>> GetAllAsync()
    {
        return await _context.TodoItems.ToListAsync();
    }

    public async Task<TodoItem> GetByIdAsync(long id)
    {
        return await _context.TodoItems.FindAsync(id);
    }

    public async Task<TodoItem> AddAsync(TodoItem todoItem)
    {
        _context.TodoItems.Add(todoItem);
        await _context.SaveChangesAsync();
        return todoItem;
    }

    public async Task UpdateAsync(TodoItem todoItem)
    {
        _context.Entry(todoItem).State = EntityState.Modified;
        await _context.SaveChangesAsync();
    }

    public async Task DeleteAsync(long id)
    {
        var todoItem = await _context.TodoItems.FindAsync(id);
        if (todoItem != null)
        {
            _context.TodoItems.Remove(todoItem);
            await _context.SaveChangesAsync();
        }
    }
}

wechat_2025-07-31_105805_938


posted @ 2025-08-07 09:10  高宏顺  阅读(261)  评论(0)    收藏  举报