栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

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

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录
      • 1、 准备条件
        • 1.1 工具准备
        • 1.2 创建数据库和数据表
      • 2、新建一个控制台项目
      • 3、用于Scaffold-DbContext基于现有数据库创建模型(EFCore反向工程)
      • 4、DbContext
      • 5、CURD 体验
          • 5.1 Create
          • 5.2 Update
          • 5.3 Delete
      • 6、CodeFirst方式构建

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 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(映射关系与导航属性)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984912.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号