第八章 数据访问和Entity Framework
8.1 Entity Framework Core介绍
什么是Entity Framework Core
Entity Framework Core (EF Core) 是一个现代的对象关系映射(ORM)框架,允许.NET开发者使用.NET对象处理数据库。它支持多种数据库提供程序,包括SQL Server、PostgreSQL、SQLite、MySQL等。
核心概念
- DbContext:表示数据库会话,负责查询和保存数据
- 实体(Entities):表示数据库表的.NET类
- DbSet:表示数据库中特定类型的实体集合
- 迁移(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();
}
}
}


浙公网安备 33010602011771号