目录
1、 准备条件
1.1 工具准备
开发软件:VisualStudio2022,EFCore6.0
.net Core版本:.Net6.0
数据库:mysql8.0
数据库管理软件:Navicat
1.2 创建数据库和数据表
打开Navicat,点击新建查询,输入如下Sql语句,创建一个名为EFCoreLearn的数据库。(自己先安装好Mysql,本实例中使用Mysql8.0)
CREATE DATABASE
IF NOT EXISTS EFCoreLearn
DEFAULT CHARSET utf8
COLLATE utf8_general_ci;
创建好数据库后,选择改数据,新建一个查询,输入如下Sql语句,创建一个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`)
);
运行上述语句后,可以成功创建数据库和数据表如下:
2、新建一个控制台项目
这里用控制台来作为演示,即使不懂Asp.Net Core 里的小白也能看懂和理解EFCore项目。
项目初始结构如下:
安装Mysql的EF CoreNuGet程序包,这里安装第三方提供的Pomelo.EntityFrameworkCore。
安装方式有如下两种:
1、命令行式安装:
在需要用EF Core的项目根目录,打开powershell或命令行,执行以下命令。
dotnet add package Microsoft.EntityFrameworkCore.Tools
dotnet add package Pomelo.EntityFrameworkCore.MySql
2、通过Visual Studio的包管理器
从 Visual Studio 菜单中选择“工具”>“NuGet> 包管理器”>“管理解决方案的NuGet程序包”,搜索并选择所需要的包进行安装即可。需要的包有:Microsoft.EntityFrameworkCore.Tools、Pomelo.EntityFrameworkCore.MySql。
或者在 "程序包管理控制台"里输入:
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Pomelo.EntityFrameworkCore.MySql
3、用于Scaffold-DbContext基于现有数据库创建模型(EFCore反向工程)
EF Core不支持用于可视化设计器的DB模型和向导来创建类似于EF 6的实体和
上下文类。因此,我们需要使用以下Scaffold-DbContext命令进行逆向工程。
此逆向工程命令DbContext基于现有数据库的架构来创建实体和上下文类(通过派生)。
1、使用dotnetCLI来进行创建
在项目目录下输入cmd,进入命令控制台,输入:
dotnet ef dbcontext scaffold “Server=localhost;Database=efcorelearn;User=root;Password=password;” “Pomelo.EntityFrameworkCore.MySql” -o Models
或者使用Nuget控制台管理
在VisualStudio 里找到视图>其他窗口>程序包控制管理台,输入:
Scaffold-DbContext -Force “Server=127.0.0.1;User Id=root;Password=yourpassword;Database=efcorelearn” -Provider “Pomelo.EntityFrameworkCore.MySql” -OutputDir Models
其中上面的
- Server=你的数据所在的ip地址,
- Database=你的数据库名称
- User 是你连接数据的用户名,
- Password=你的Password,
- -O 后的Models是指文件名称。
运行上述命令后得到结果如下:
4、DbContext
在Models文件夹里生成的两个类,最重要的是 efcorelearnContext和实体类Student; 其中efcorelearnContext 是承上启下的关键,它是对ADO.Net的封装,后面我们会详细说明,这里先了解。
其主要结构如下:
在上述方法中,核心方法是OnModelCreating这个方法,这个方法是用来将实体类和数据库表进行映射的。
DbSet Students表示的是是学生表,数据库的每个表在这个类中都是以DbSet 的属性出现。
5、CURD 体验
下面我们简单的体验下增删改查的使用
5.1 Create
static void Main(string[] args)
{
using (var db=new efcorelearnContext())
{
Student student = new Student()
{
Name = "小明",
Class = "软件一班"
};
db.Students.Add(student);
db.SaveChanges();//提交更改后才能保存到数据库。
}
运行后如下:
5.2 Update
更新数据库主要有四种方法,这四种方法根据情况不同,可以在不同的情况下使用。后面还会详细讲解。
using (var db=new efcorelearnContext())
{
//更新方式1 Update
Student student = new Student()
{
StudentId = 1,
Name = "小明",
Class = "软件2班"
};
db.Students.Update(student);
db.SaveChanges();
//更新方式2 先查询,再修改
var stu1 = db.Students.AsEnumerable().First(a => a.StudentId == 1);//或者var stu1=db.Students.Single(a => a.StudentId == 1)
stu1.Name = "小红";
EntityState ss = db.Entry(stu1).State;//unchanged
db.SaveChanges();
//更新方式3 设置 EntityState的状态和Update类似
Student stu2 = new Student();
stu2.Name = "小李";
stu2.StudentId = 1;
stu2.Class = "软件3班";
db.Entry(stu2).State = EntityState.Modified;
db.SaveChanges();
//更新方式4 Attach方法
Student stu3 = new Student();
stu3.Name = "小明";
stu3.StudentId = 1;
stu3.Class = "软件1班";
db.Students.Attach(stu3);
db.Entry(stu3).State = EntityState.Modified;
db.SaveChanges();
}
5.3 Delete
static void Main(string[] args)
{
using (var db=new efcorelearnContext())
{
//删除方式1 Remove
Student student=new Student();
student.StudentId = 1;
db.Students.Remove(student);
db.SaveChanges();
//删除方式2 先查询再删除
db.Students.Remove(db.Students.Find(1));//这里Find只要填写主键的值就能找到
db.SaveChanges();
//删除方式3 EntityState.Deleted
Student student2 = new Student();
student.StudentId = 1;
db.Entry(student).State=EntityState.Deleted;
db.SaveChanges();
}
}
6、CodeFirst方式构建
将原来的数据库全部删除,新建一个控制台程序。
1、创建实体类,Student
public class Student
{
public uint StudentId { get; set; }
public string Name { get; set; }
public string Class { get; set; }
}
2、创建上下文EFDBContext
删除Models文件夹里的efcorelearnContext类,然后添加一个新类 EFDBContext,继承DBcontext 主要内容如下:
public class EFDBContext:DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//需要填写连接字符串和数据库版本
optionsBuilder.UseMySql("server=localhost;database=efcorelearn;user=root;password=123456", ServerVersion.FromString("8.0.20-mysql"));
}
public DbSet<Student> Students { get; set; }
}
连接字符串里注意 Server=你的数据库所在的ip,password=你设置的密码
3、开启迁移并生产数据库
然后再程序包管理控制台里输入如下命令,用代码生成数据库。
Add-Initial 迁移名称,这里的迁移名称是第一次,所以写为Initial
1、Add-Migration Initial
执行完上述命令后,可以看到在程序里多了个Migrations文件夹,这里是迁移自动生成的文件,后面我们会详细研究。
2、Update-DataBase
执行完上述命令后,打开数据库发现并没有创建数据,需要执行Update-DataBase 才会生成数据库。
运行后如图生成新的数据库和相关的数据表如下:
可以看到数据库里还有个_efmigrationshistory表,这个表是记录迁移历史记录的,一般不需要管,也不要删除或者修改。
完成上述工作。就已经实现了用代码创建数据,可以自行进行增删改查了。