当前位置: 首页 > news >正文

Entity Framework框架

深入理解C#中的Entity Framework框架:从理论到实践

在C#开发中,与数据库交互是几乎所有应用程序的核心需求之一。Entity Framework (EF) 作为微软官方推出的ORM框架,极大地简化了数据库操作。本文将带您深入理解EF框架的核心概念,并通过详细代码示例演示增删改查(CRUD)操作的完整实现。

一、Entity Framework框架概述

Entity Framework是微软开发的开源对象关系映射(ORM)框架,它充当了应用程序对象与数据库之间的桥梁。通过EF,开发者可以使用面向对象的编程方式操作数据库,而无需直接编写SQL语句。EF支持两种主要开发模式:

Code First:先编写实体类,然后通过迁移生成数据库表结构
Database First:基于现有数据库生成实体类

本文将重点演示Code First模式,这是现代开发中更常用的方式。

二、核心概念详解

1. DbContext

DbContext是EF框架的核心类,代表数据库会话。它管理所有实体对象的生命周期,并提供与数据库交互的入口点。每个DbContext实例对应一个数据库连接

2. DbSet

DbSet代表数据库中的表,用于执行CRUD操作每个DbSet属性对应数据库中的一个表

3. 迁移(Migrations)

迁移是EF框架的数据库版本控制机制。通过迁移,开发者可以使用C#代码来更新数据库结构,保持模型与数据库同步。

4. 实体类

实体类是与数据库表对应的POCO(Plain Old CLR Object)类。通过数据注解或Fluent API可以配置实体类与数据库表的映射关系

三、环境准备与代码实现

1. 创建项目并安装NuGet包

首先创建一个新的C#控制台应用程序,然后通过NuGet包管理器安装以下包:

dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Design

2. 定义实体类

创建Student.cs文件,定义学生实体类:

using System.ComponentModel.DataAnnotations;
 
public class Student
{
    [Key]
    public int StudentId { get; set; }
    
    [Required]
    [MaxLength(50)]
    public string Name { get; set; }
    
    public DateTime EnrollmentDate { get; set; }
    public bool IsActive { get; set; }
}

3. 创建DbContext

创建SchoolContext.cs文件,继承DbContext

using Microsoft.EntityFrameworkCore;
 
public class SchoolContext : DbContext
{
    public SchoolContext(DbContextOptions<SchoolContext> options)
        : base(options) { }
 
    public DbSet<Student> Students { get; set; }
}

4. 配置连接字符串

appsettings.json中添加数据库连接字符串:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=SchoolDB;Trusted_Connection=True;"
  }
}

5. 注册服务

Program.cs注册DbContext服务

using Microsoft.EntityFrameworkCore;
 
var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json");
 
var configuration = builder.Build();
 
builder.Services.AddDbContext<SchoolContext>(options =>
    options.UseSqlServer(configuration.GetConnectionString("DefaultConnection")));
 
var app = builder.Build();

6. 创建并应用迁移

打开命令行工具,执行以下命令:

dotnet ef migrations add InitialCreate
dotnet ef database update

这将生成初始迁移并更新数据库创建Students表

四、CRUD操作实现

创建StudentRepository.cs文件,实现CRUD操作:

using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading.Tasks;
 
public class StudentRepository
{
    private readonly SchoolContext _context;
 
    public StudentRepository(SchoolContext context)//通过构造方法取出SchoolContext 实例
    {
        _context = context;
    }
 
    // 创建学生
    public async Task CreateAsync(Student student)
    {
        _context.Students.Add(student);
        await _context.SaveChangesAsync();
    }
 
    // 获取所有学生
    public async Task<List<Student>> GetAllAsync()
    {
        return await _context.Students.ToListAsync();
    }
 
    // 根据ID获取学生
    public async Task<Student> GetByIdAsync(int id)
    {
        return await _context.Students.FindAsync(id);
    }
 
    // 更新学生
    public async Task UpdateAsync(Student student)
    {
        _context.Entry(student).State = EntityState.Modified;
        await _context.SaveChangesAsync();
    }
 
    // 删除学生
    public async Task DeleteAsync(int id)
    {
        var student = await _context.Students.FindAsync(id);
        if (student != null)
        {
            _context.Students.Remove(student);
            await _context.SaveChangesAsync();
        }
    }
}

五、使用示例

Main方法中演示CRUD操作:

var studentRepository = new StudentRepository(app.Services.GetRequiredService<SchoolContext>());
 
// 创建学生
var newStudent = new Student 
{
    Name = "张三",
    EnrollmentDate = DateTime.Now,
    IsActive = true
};
await studentRepository.CreateAsync(newStudent);
 
// 查询所有学生
var students = await studentRepository.GetAllAsync();
foreach (var student in students)
{
    Console.WriteLine($"ID: {student.StudentId}, 姓名: {student.Name}");
}
 
// 更新学生
var studentToUpdate = await studentRepository.GetByIdAsync(1);
if (studentToUpdate != null)
{
    studentToUpdate.Name = "李四";
    await studentRepository.UpdateAsync(studentToUpdate);
}
 
// 删除学生
await studentRepository.DeleteAsync(1);

六、注意事项

异常处理:实际开发中应添加try-catch块处理数据库操作异常
依赖注入:推荐使用依赖注入管理DbContext生命周期
数据库选择:可根据需要替换为MySQL、PostgreSQL等其他数据库提供程序
性能优化:对于复杂查询,建议使用AsNoTracking()提升性能
事务处理:需要事务时可以使用DbContext.Database.BeginTransaction()

七、结语

Entity Framework框架通过其强大的ORM功能,极大地简化了C#应用程序中的数据库操作。通过Code First模式,开发者可以更加专注于业务逻辑的实现,而无需关心底层数据库结构的细节。本文演示了EF框架的基本使用方法,实际项目中可以根据需求添加更多功能如分页查询、复杂查询、缓存机制等。

相关文章:

  • Crow:C++高性能微服务框架的深度探索
  • MyBatisPlus(SpringBoot版)学习第三讲:通用Service
  • 决策树基础
  • 代码随想录算法训练营第38天 | 322. 零钱兑换 279.完全平方数 139.单词拆分 背包问题总结
  • “跨越时代的技术进步:CPU缓存如何塑造了智能手机和智能家居的未来?
  • 【2025】基于ssm+jsp的二手商城系统设计与实现(源码、万字文档、图文修改、调试答疑)
  • go-zero学习笔记
  • 第39章:CSI插件开发与定制化存储需求
  • Django框架视图与路由(一)
  • 我的Go学习路线概览
  • 关于 URH(Universal Radio Hacker) 的详细介绍、安装指南、配置方法及使用说明
  • Java 的 AutoCloseable 接口
  • 警翼(Pe)执法记录仪格式化后的恢复方法
  • 分类预测 | Matlab实现BO-GRU-Attention贝叶斯优化门控循环单元融合注意力机制多特征分类预测
  • 【系统稳定性】1.13 解析gcore
  • 京东一面:MySQL 主备延迟有哪些坑?主备切换策略
  • 【AI模型】深度解析:DeepSeek的联网搜索的实现原理与认知误区
  • 运功学-【机械臂】
  • 1.设备电气设计、装配的注意事项
  • C语言入门教程100讲(19)do-while 循环
  • “五一”假期首日迎出游高峰:火车站人流“堪比春运”,热门景区门票预订量同比增三成
  • 案件发回重审,李在明参选韩总统之路再添波折
  • 国铁集团去年收入12830亿元增3%,全年铁路运输利润总额创新高
  • 五大国货美妆去年业绩分化:珀莱雅百亿营收领跑,上海家化转亏
  • 金砖国家外长会晤发表主席声明,强调南方国家合作
  • 中共中央、国务院关于表彰全国劳动模范和先进工作者的决定