EFCore:Entity Framework Code初体验
1、整备业务环境
开发软件:VisualStudio2019,EFCore 3.1.32 .net Core版本:.Net 3.1 数据库:mysql 5.6.50 数据库管理软件:PHPmyadmin
2、创建数据库与表
本实例使用宝塔面板创建MYsql数据库。
2.1创建数据库
2.2 创建Students表
CREATE TABLE IF NOT EXISTS `Students` ( `StudentId` INT UNSIGNED AUTO_INCREMENT, `Name` VARCHAR(50) NOT NULL, `Class` VARCHAR(50) NOT NULL, PRIMARY KEY (`StudentId`) );
3、创建.NET Code控制台应用程序
4、安装MYSQL的EF CoreNuGet程序包,这里安装第三方提供的Pomelo.EntityFrameworkCore.Mysql
5、用于Scaffold-DbContext基于现有数据库创建模型(EFCore反向工程)
使用Nuget控制台管理 > 在VisualStudio 里找到视图>其他窗口>程序包控制管理台,输入:
Scaffold-DbContext -Force “Server=b.lifeiai.com;User Id=EFStudent;Password=lf123456;Database=efstudent” -Provider “Pomelo.EntityFrameworkCore.MySql” -OutputDir Models
除了使用Nuget控制台管理安装以外,也可以使用CMD安装?
dotnet ef dbcontext scaffold “Server=b.lifeiai.com;Database=efstudent;User=EFStudent;Password=lf123456;” “Pomelo.EntityFrameworkCore.MySql” -o Models
这里需要安装:Microsoft.EntityFrameworkCore.Tools
6、通过DbContext创建实体类和数据库映射类
操作第5步后,会在在Models文件夹里生成的两个类,最重要的是 efcorelearnContext和实体类Student; 其中efcorelearnContext 是承上启下的关键,它是对ADO.Net的封装,后面我们会详细说明,这里先了解。
6.1实体类Student
6.2 efcorelearnContext
在上图中OnModelCreating是用来将实体类和数据库表进行映射的,至关重要。
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Students>(entity => { entity.HasKey(e => e.StudentId) .HasName("PRIMARY"); entity.Property(e => e.StudentId).HasColumnType("int(10) unsigned"); entity.Property(e => e.Class) .IsRequired() .HasColumnType("varchar(50)") .HasCharSet("utf8mb4") .HasCollation("utf8mb4_general_ci"); entity.Property(e => e.Name) .IsRequired() .HasColumnType("varchar(50)") .HasCharSet("utf8mb4") .HasCollation("utf8mb4_general_ci"); }); OnModelCreatingPartial(modelBuilder); }
DbSet<Students>表示的是学生表,数据库的每个表在这个类中都是以DbSet 的属性出现。
public virtual DbSet<Students> Students { get; set; }
7、使用Pomelo.EntityFrameworkCore.Mysql初体验Create、Update、Delete、Select数据
接下来简单的实现一下数据的增删改的相关方法
7.1 增加(Create)
using EFStudent.Models; using System; namespace EFStudent { class Program { static void Main(string[] args) { using (var db = new efstudentContext()) { Students student = new Students() { Name = "李明", Class = "工程一班" }; db.Students.Add(student); //提交更改 db.SaveChanges(); } } } }
结果预览如下:
7.2更新(Update)
更新数据库主要有四种方法,这四种方法根据情况不同,可以在不同的情况下使用。
using EFStudent.Models; using Microsoft.EntityFrameworkCore; using System; using System.Linq; namespace EFStudent { class Program { static void Main(string[] args) { using (var db = new efstudentContext()) { //更新方式1 Update Students student = new Students() { StudentId = 1, Name = "李明", Class = "软件二班" }; db.Students.Update(student); db.SaveChanges(); //更新方式2 先查询,再修改 //var stu1=db.Students.Single(a => a.StudentId == 1) var stu1 = db.Students.AsEnumerable().First(a => a.StudentId == 1); stu1.Name = "李明"; stu1.Class = "软件三班"; EntityState ss = db.Entry(stu1).State;//unchanged db.SaveChanges(); //更新方式3 设置 EntityState的状态和Update类似 Students stu2 = new Students(); stu2.Name = "李明"; stu2.StudentId = 1; stu2.Class = "软件四班"; db.Entry(stu2).State = EntityState.Modified; db.SaveChanges(); //更新方式4 Attach方法 Students stu3 = new Students(); stu3.Name = "李明"; stu3.StudentId = 1; stu3.Class = "软件五班"; db.Students.Attach(stu3); db.Entry(stu3).State = EntityState.Modified; db.SaveChanges(); } } } }
7.3 删除(delete)
using var db = new efstudentContext(); var resualt = db.Students.Single(x => x.StaffInfoId == id); db.Students.Remove(resualt); //提交更改 db.SaveChanges();
7.4查询(select)
using var db = new efstudentContext(); var st = db.Students.Single(x => x.StudentId == 1); Console.WriteLine($"Name:{st.Name},Class:{st.Class},Id:{st.StudentId}");
8.CodeFirst方式构建
8.1、创建新实体类,Student
public partial class Student { public uint StudentId { get; set; } public string Name { get; set; } public string Class { get; set; } }
8.2创建上下文EFDBContext
添加一个新类 EFDBContext,继承DBcontext 主要内容如下:
public class EFDBContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { //需要填写连接字符串和数据库版本 string str = "5.6.50-mysql"; optionsBuilder.UseMySql("server=b.lifeiai.com;user id=EFStudent;password=lf123456;database=efstudent", ServerVersion.Parse(str)); } public DbSet<Student> Students { get; set; } }
8.3然后再程序包管理控制台里输入如下命令,用代码生成数据库。
Add-Initial 迁移名称,这里的迁移名称是第一次,所以写为Initial
Add-Migration Initial Update-DataBase