当前位置:首页 > 技能相关 > .NET > 正文内容

EFCore:Entity Framework Code初体验

admin1年前 (2023-12-25).NET2770 修订时间:2024-01-25 16:21:37

1、整备业务环境

开发软件:VisualStudio2019,EFCore 3.1.32  .net Core版本:.Net 3.1  数据库:mysql 5.6.50  数据库管理软件:PHPmyadmin

2、创建数据库与表

本实例使用宝塔面板创建MYsql数据库。

2.1创建数据库

微信截图_20231225152605.png

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控制台应用程序

微信截图_20231225152217.png

4、安装MYSQL的EF CoreNuGet程序包,这里安装第三方提供的Pomelo.EntityFrameworkCore.Mysql

image.png

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


image.png

image.png

这里需要安装:Microsoft.EntityFrameworkCore.Tools

6、通过DbContext创建实体类和数据库映射类

操作第5步后,会在在Models文件夹里生成的两个类,最重要的是 efcorelearnContext和实体类Student; 其中efcorelearnContext 是承上启下的关键,它是对ADO.Net的封装,后面我们会详细说明,这里先了解。

6.1实体类Student

image.png

6.2 efcorelearnContext

image.png

在上图中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; }

拓展:DBContext的基本配置

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();
            }
        }
    }
}

结果预览如下:

image.png

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

微信截图_20231225184626.png

image.png


 您阅读本篇文章共花了: 

免责声明
本站内容均为博客主本人日常使用记录的存档,如侵犯你的权益请联系:lifei@zaiheze.com 546262132@qq.com 沟通删除事宜。本站仅带访问端口形式使用,已杜绝搜索引擎爬取。

扫描二维码推送至手机访问。

版权声明:本文由LIFEI - blog发布,如需转载请注明出处。

本文链接:http://www.lifeiai.com/?id=346

分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。