首页 > 其他分享 >EFCore CodeFirst(2)

EFCore CodeFirst(2)

时间:2023-12-15 18:12:28浏览次数:37  
标签:CodeFirst Name Students 数据库 db EFCore new Age

目的:使用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()之后,才会实际更新到数据库表格中

 

标签:CodeFirst,Name,Students,数据库,db,EFCore,new,Age
From: https://www.cnblogs.com/luohualiushui1173/p/17901726.html

相关文章

  • EFCore 简介(1)
    EFCore是微软的一个ORM框架,全称:Microsoft.EntityFrameworkCoreORM(ObjectRelationalMapping):对象关系映射,让开发者用对象的形式操作关系数据库常用的ORM框架:EF、EFCore、Dapper、SqlSugar、Freesql每种ORM都有自己的优缺点EFCore有两种模式:DBFirst(数据库优先)和CodeFirst(代码优......
  • EF CodeFirst 数据注解特性详解
    数据注解特性是.NET特性,可以在EF或者EFCore中,应用于实体类上或者属性上进行生成数据表,并对表名、字段类型、长度、主键、是否为空、外键等进行设置。1、命名空间在EF6和EFCore中,数据注解特性包含在System.ComponentModel.DataAnnotations命名空间和System.ComponentModel.Dat......
  • 在Rider 中使用Entity Framework Core UI 插件创建EFCore 的 Migration迁移文件时报错
    报错信息EFCoretoolsarerequiredtoexecutethisaction在点击报错信息中的发Fix进行安装时,再次出错这次是提示版本不匹配这里我使用的是EFCore7.0.14版本的报错原因没有安装dotnettool点击Fix进行安装时,是安装的最新版,是要是.net7的安装dotnettool直......
  • Entity FrameworkCore(EFCore)使用SqlServer、Mysql和Sqlite
    EntityFrameworkCore(EFCore)使用SqlServer、Mysql和Sqlite使用工厂方法模式创建抽象工厂类{publicDbSet<Blog>Blogs{get;set;}publicDbSet<Post>Posts{get;set;}}```......
  • .Net6 and VsCode CodeFirst开发和迁移使用
    ------------VsCode开发.net6----------------------------------干货如下:C#BaselanguagesupportforC#包含vscode的调试C#DevKitC#ExtensionsIntelliCodeIntelliCodeAPIUsageExamplesIntelliCodeCompletionsIntelliCodeforC#DevKitIntelliCodeInsi......
  • C# EntityFramework+SQLite CodeFirst 创建数据库和数据表
    1、安装NuGet包System.Data.SQLite(System.Data.SQLite.Core、System.Data.SQLite.EF6、System.Data.SQLite.Linq)SQLite.CodeFirstEntityFramework2、配置App.config<?xmlversion="1.0"encoding="utf-8"?><configuration><configSe......
  • EFCore 使用FluntApi配置 全局查询筛选器
    我们在类中通常会有一个属性为IsDel来表示软删除或也称逻辑删除,这个属性会导致我们在进行查询操作时,每一次都要.where(s=>s.IsDel==false)非常的麻烦。在使用efCore时可以通过配置查询筛选器来很好的解决这个问题。publicclassSysUser{publiclongId{get;set;}......
  • EFCore 实体配置方式
    EFCore有两种实体配置方式1、DataAnnotation优点:简单;缺点:耦合[Table("Persons")]publicclassPerson{publicintId{get;set;}[Required][MaxLength(50)]publicstringName{get;set;}}2、FluentAPI(推荐)优点:解耦;缺点:较复杂//实体类......
  • EFCore学习笔记 - 主键
    主键1、自增主键简单,但是不满足分布式,并发性能差long、int等类型主键,默认为自增自增字段的代码中不能为Id赋值,必须保持默认值0,否则运行的时候就会报错因为是数据库生成的值,所以SaveChanges()后会自动把主键的值更新到Id例子:插入帖子后,自动重定向......
  • Asp-Net-Core开发笔记:EFCore统一实体和属性命名风格
    前言C#编码规范中,类和属性都是大写驼峰命名风格(PascalCase/UpperCamelCase),而在数据库中我们往往使用小写蛇形命名(snake_case),在默认情况下,EFCore会把原始的类名和属性名直接映射到数据库,这不符合数据库的命名规范。为了符合命名规范,而且也为了看起来更舒服,需要自己做命名转换......