EFCore CodeFirst(2)

发布时间 2023-12-15 18:03:06作者: 落花流水1173

目的:使用EFCore 的CodeFirst实现简单的增删改查,只注重流程搭建,不涉及到比较复杂的配置和应用等

Nuget包安装:

Micosoft.EntityFrameworkCore:EFCore基础包

Micosoft.EntityFrameworkCore.SqlServer:该系列文章使用SQLServer数据库,因此需要引用这个包,如果是其它数据库,查找对应的包安装即可

Micosoft.EntityFrameworkCore.Tool:工具包,迁移数据库需要用到的包

第1步:创建实体类Student

 public class Student
 {
     public long Id { get; set; }
     /// <summary>
     /// 学号
     /// </summary>
     public string Num { get; set; }
     /// <summary>
     /// 名称
     /// </summary>
     public string Name { get; set; }
     /// <summary>
     /// 年龄
     /// </summary>
     public int Age {  get; set; }

 }

第2步:创建实体类对应的配置类,后续会解析配置类的作用,目前只需要照做就行

        配置类需要继承泛型接口IEntityTypeConfiguration<T>,T对应需要配置的实体,实现Configure方法

 public class StudentConfig : IEntityTypeConfiguration<Student>
 {
     public void Configure(EntityTypeBuilder<Student> builder)
     {
        
     }
 }

第3步:创建继承于DBContext的类,该类主要是配置DBSet<T>类型属性,每一个DBSet<T>对应数据库中的一个表格

            还有就是通过重写OnConfiguring方法进行数据库的连接操作

            重写OnModelCreating方法进行实体类的配置

 

 public class MyDbContext:DbContext
 {

    public DbSet<Student> Students { get; set; }

     protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
     {
         //MyDemo1是要创建和连接的数据库名称,sa、fs888是我SQLServer的用户名和密码,需要根据自己配置进行修改
         optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=MyDemo1;User ID=sa;Password=fs888;Encrypt=False;");
        
     }
     protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
         base.OnModelCreating(modelBuilder);
         modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
         
     }
 }

第4步:进行数据库的迁移,在VS中的”程序包管理控制台“进行,迁移有很多指令,这里只讲解两个指令

            add-migration xxx:生成一次迁移(可以是数据库的初次创建或者表的更新 ),名字需要有意义并且合法,方便后面回滚,执行后会在项目的Migrations文件夹中生成操作数据库的代码

执行完 add-migration xxx指令后,项目中会自动生成迁移文件夹Migrations,一般不要手动去删除,后续回滚可能需要

 生成迁移文件后,这是数据库中还没有生成对应的数据库文件,需要执行下面指令,

Update-database,执行成功后表就完成迁移,查看数据库可以看到变化

 执行完Update-database,查看数据库,可以看到”MyDemo1“数据库已经建成,数据库中有一个”Students“表,是因为第三步中我们配置了

public DbSet<Student> Students { get; set; }

 

 至此,最简单的使用EFCore通过代码生成数据库就完成了,下面我们在做一些简单的增删改查

往Students中增加两条数据:

 static void Main(string[] args)
 {
     //因为DBContext继承于IDispose,所以使用Using,防止内存泄漏
     //对数据库的操作相当于对DBContext的操作
     using (MyDbContext db = new MyDbContext())
     {
         //在Students表中增加两条数据,不能显示设置Id,因为Id在数据库中默认是自增的
         db.Students.Add(new Student {  Name = "Devi", Age = 18, Num = "00000016" });
         db.Students.Add(new Student {  Name = "Sam", Age = 28, Num = "000000156" });
         //保存数据库修改
         db.SaveChanges();
     }
 }

查看数据库中Students表格,增加了两条数据:

 

删除:

static void Main(string[] args)
{
    //因为DBContext继承于IDispose,所以使用Using,防止内存泄漏
    //对数据库的操作相当于对DBContext的操作
    using (MyDbContext db = new MyDbContext())
    {
        //在Students表中增加两条数据,不能显示设置Id,因为Id在数据库中默认是自增的
        //db.Students.Add(new Student {  Name = "Devi", Age = 18, Num = "00000016" });
        //db.Students.Add(new Student {  Name = "Sam", Age = 28, Num = "000000156" });

        //删除Students中的Name="Devi"的数据
        var s1 = db.Students.Where(x => x.Name == "Devi").First();
        db.Students.Remove(s1);

        //保存数据库修改
        db.SaveChanges();
    }
}

删除后查看数据库中Students表格,发现剩下一条数据:

 改:

 static void Main(string[] args)
 {
     //因为DBContext继承于IDispose,所以使用Using,防止内存泄漏
     //对数据库的操作相当于对DBContext的操作
     using (MyDbContext db = new MyDbContext())
     {
         //在Students表中增加两条数据,不能显示设置Id,因为Id在数据库中默认是自增的
         //db.Students.Add(new Student {  Name = "Devi", Age = 18, Num = "00000016" });
         //db.Students.Add(new Student {  Name = "Sam", Age = 28, Num = "000000156" });

         //删除Students中的Name="Devi"的数据
         // var s1 = db.Students.Where(x => x.Name == "Devi").First();
         //db.Students.Remove(s1);

         //修改Students表中Name="Sam"的数据,把Age改为38
         var s2 = db.Students.Where(x => x.Name == "Sam").First();
         s2.Age = 38;

         //保存数据库修改
         db.SaveChanges();
     }
 }

修改后数据库的Students表格如下:

 

查询:

 static void Main(string[] args)
 {
     //因为DBContext继承于IDispose,所以使用Using,防止内存泄漏
     //对数据库的操作相当于对DBContext的操作
     using (MyDbContext db = new MyDbContext())
     {
         //在Students表中增加两条数据,不能显示设置Id,因为Id在数据库中默认是自增的
         //db.Students.Add(new Student {  Name = "Devi", Age = 18, Num = "00000016" });
         //db.Students.Add(new Student {  Name = "Sam", Age = 28, Num = "000000156" });

         //删除Students中的Name="Devi"的数据
         // var s1 = db.Students.Where(x => x.Name == "Devi").First();
         //db.Students.Remove(s1);

         //修改Students表中Name="Sam"的数据,把Age改为38
         //var s2 = db.Students.Where(x => x.Name == "Sam").First();
         //s2.Age = 38;

         //查询Students表格中所有的行数
         var s3 = db.Students;
         foreach (var student in s3)
         {
             Console.WriteLine($"Id;{student.Id} Name:{student.Name} Age:{student.Age} Num:{student.Num}");
         }

         //保存数据库修改
         db.SaveChanges();
     }
 }

结果:1条数据

 

注意:对数据库的所有修改,只有执行了SaveChanges()之后,才会实际更新到数据库表格中