EFCore 从入门到精通-2(初体验)

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表,这个表是记录迁移历史记录的,一般不需要管,也不要删除或者修改。
完成上述工作。就已经实现了用代码创建数据,可以自行进行增删改查了。

EFCore 从入门到精通-1(总览)
EFCore 从入门到精通-3(映射关系与导航属性)

  • 12
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值