Entity Framework框架

打印 上一主题 下一主题

主题 1676|帖子 1676|积分 5028

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
深入明白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包管理器安装以下包:
  1. dotnet add package Microsoft.EntityFrameworkCore.SqlServer
  2. dotnet add package Microsoft.EntityFrameworkCore.Design
复制代码
2. 定义实体类

创建Student.cs文件,定义门生实体类:
  1. using System.ComponentModel.DataAnnotations;
  2. public class Student
  3. {
  4.     [Key]
  5.     public int StudentId { get; set; }
  6.    
  7.     [Required]
  8.     [MaxLength(50)]
  9.     public string Name { get; set; }
  10.    
  11.     public DateTime EnrollmentDate { get; set; }
  12.     public bool IsActive { get; set; }
  13. }
复制代码
3. 创建DbContext

创建SchoolContext.cs文件,继承DbContext
  1. using Microsoft.EntityFrameworkCore;
  2. public class SchoolContext : DbContext
  3. {
  4.     public SchoolContext(DbContextOptions<SchoolContext> options)
  5.         : base(options) { }
  6.     public DbSet<Student> Students { get; set; }
  7. }
复制代码
4. 设置毗连字符串

在appsettings.json中添加数据库毗连字符串:
  1. {
  2.   "ConnectionStrings": {
  3.     "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=SchoolDB;Trusted_Connection=True;"
  4.   }
  5. }
复制代码
5. 注册服务

在Program.cs中注册DbContext服务
  1. using Microsoft.EntityFrameworkCore;
  2. var builder = new ConfigurationBuilder()
  3.     .SetBasePath(Directory.GetCurrentDirectory())
  4.     .AddJsonFile("appsettings.json");
  5. var configuration = builder.Build();
  6. builder.Services.AddDbContext<SchoolContext>(options =>
  7.     options.UseSqlServer(configuration.GetConnectionString("DefaultConnection")));
  8. var app = builder.Build();
复制代码
6. 创建并应用迁移

打开下令行工具,执行以下下令:
  1. dotnet ef migrations add InitialCreate
  2. dotnet ef database update
复制代码
这将生成初始迁移并更新数据库,创建Students表
四、CRUD操作实现

创建StudentRepository.cs文件,实现CRUD操作:
  1. using Microsoft.EntityFrameworkCore;
  2. using System.Collections.Generic;
  3. using System.Threading.Tasks;
  4. public class StudentRepository
  5. {
  6.     private readonly SchoolContext _context;
  7.     public StudentRepository(SchoolContext context)//通过构造方法取出SchoolContext 实例
  8.     {
  9.         _context = context;
  10.     }
  11.     // 创建学生
  12.     public async Task CreateAsync(Student student)
  13.     {
  14.         _context.Students.Add(student);
  15.         await _context.SaveChangesAsync();
  16.     }
  17.     // 获取所有学生
  18.     public async Task<List<Student>> GetAllAsync()
  19.     {
  20.         return await _context.Students.ToListAsync();
  21.     }
  22.     // 根据ID获取学生
  23.     public async Task<Student> GetByIdAsync(int id)
  24.     {
  25.         return await _context.Students.FindAsync(id);
  26.     }
  27.     // 更新学生
  28.     public async Task UpdateAsync(Student student)
  29.     {
  30.         _context.Entry(student).State = EntityState.Modified;
  31.         await _context.SaveChangesAsync();
  32.     }
  33.     // 删除学生
  34.     public async Task DeleteAsync(int id)
  35.     {
  36.         var student = await _context.Students.FindAsync(id);
  37.         if (student != null)
  38.         {
  39.             _context.Students.Remove(student);
  40.             await _context.SaveChangesAsync();
  41.         }
  42.     }
  43. }
复制代码
五、利用示例

在Main方法中演示CRUD操作:
  1. var studentRepository = new StudentRepository(app.Services.GetRequiredService<SchoolContext>());
  2. // 创建学生
  3. var newStudent = new Student
  4. {
  5.     Name = "张三",
  6.     EnrollmentDate = DateTime.Now,
  7.     IsActive = true
  8. };
  9. await studentRepository.CreateAsync(newStudent);
  10. // 查询所有学生
  11. var students = await studentRepository.GetAllAsync();
  12. foreach (var student in students)
  13. {
  14.     Console.WriteLine($"ID: {student.StudentId}, 姓名: {student.Name}");
  15. }
  16. // 更新学生
  17. var studentToUpdate = await studentRepository.GetByIdAsync(1);
  18. if (studentToUpdate != null)
  19. {
  20.     studentToUpdate.Name = "李四";
  21.     await studentRepository.UpdateAsync(studentToUpdate);
  22. }
  23. // 删除学生
  24. await studentRepository.DeleteAsync(1);
复制代码
六、注意事项

非常处置惩罚:现实开辟中应添加try-catch块处置惩罚数据库操作非常
依赖注入:保举利用依赖注入管理DbContext生命周期
数据库选择:可根据必要更换为MySQL、PostgreSQL等其他数据库提供程序
性能优化:对于复杂查询,建议利用AsNoTracking()提升性能
事件处置惩罚:必要事件时可以利用DbContext.Database.BeginTransaction()
七、结语

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

写过一篇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表