EF CodeFirst增删改查之‘CRUD’

2023-11-23 13:30
文章标签 改查 增删 crud ef codefirst

本文主要是介绍EF CodeFirst增删改查之‘CRUD’,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来。

   十年河东十年河西,莫欺少年穷

   学无止境,精益求精

   本篇旨在学习EF增删改查四大操作

   上一节讲述了EF CodeFirst 创建数据库,本节继续引用上一节的相关类学习EF的CRUD操作

   废话少说,直接上要点,上一节中的模型类我作了如下修改:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
using System.Linq;
using System.Web;namespace EF_Test.DAL
{public class Student{[Key]public int Id { get; set; }[Required][StringLength(10)]public string Name { get; set; }//姓名[StringLength(2)]public string Sex { get; set; }//性别[StringLength(20)]public string StudentNum { get; set; }//学号
    }public class Course{[Key]public int Id { get; set; }[Required][StringLength(20)]public string Name { get; set; }//课程名称
    }public class Score{[Key]public int Id { get; set; }public int StudentScore { get; set; }//学生分数public int StudentID { get; set; }//学生IDpublic int CourseID { get; set; }//课程IDpublic virtual Student Student { get; set; }//virtual关键字修饰,用于延迟加载 提高性能 只有显式调用时  属性==对象public virtual Course Course { get; set; }//virtual关键字修饰,用于延迟加载 提高性能 只有显式调用时  属性==对象
    }public class StudentContext : DbContext{public StudentContext(): base("StudentContext")//指定连接字符串
        {}public DbSet<Student> Students { get; set; }public DbSet<Course> Courses { get; set; }public DbSet<Score> Scores { get; set; }/// <summary>/// OnModelCreating方法中的modelBuilder.Conventions.Remove语句禁止表名称正在多元化。如果你不这样做,所生成的表将命名为Students、Courses和Enrollments。相反,表名称将是Student、Course和Enrollment。开发商不同意关于表名称应该多数。本教程使用的是单数形式,但重要的一点是,您可以选择哪个你更喜欢通过包括或省略这行代码的形式。/// </summary>/// <param name="modelBuilder"></param>protected override void OnModelCreating(DbModelBuilder modelBuilder){modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();}}
}

   有了以上模型类,我们就可以创建一些测试数据了

   新建一个StudentInitializer类如下:

    public class StudentInitializer : System.Data.Entity.DropCreateDatabaseIfModelChanges<StudentContext>{public void InitLoad(StudentContext context){//添加学生var studentList = new List<Student>{new Student{Name = "陈依依", Sex = "", StudentNum = "081309201"},new Student{Name = "戚永景", Sex = "", StudentNum = "081309202"},new Student{Name = "刘华丽", Sex = "", StudentNum = "081309203"},new Student{Name = "薛正钦", Sex = "", StudentNum = "081309204"},new Student{Name = "王松涛", Sex = "", StudentNum = "081309205"},new Student{Name = "王自龙", Sex = "", StudentNum = "081309206"},new Student{Name = "高其峰", Sex = "", StudentNum = "081309207"},new Student{Name = "陈欣欣", Sex = "", StudentNum = "081309208"},new Student{Name = "陈丽阳", Sex = "", StudentNum = "081309209"}};studentList.ForEach(s => context.Students.Add(s));context.SaveChanges();//添加课程var courseList = new List<Course>{new Course{ Name="数据结构"},new Course{ Name="计算机原理"},new Course{ Name="网络技术"}};courseList.ForEach(s => context.Courses.Add(s));context.SaveChanges();//添加分数var scoreList = new List<Score>(){new Score{ StudentID=1,CourseID=1,StudentScore=90},new Score{ StudentID=2,CourseID=1,StudentScore=91},new Score{ StudentID=3,CourseID=1,StudentScore=92},new Score{ StudentID=4,CourseID=1,StudentScore=93},new Score{ StudentID=5,CourseID=1,StudentScore=94},new Score{ StudentID=6,CourseID=1,StudentScore=95},new Score{ StudentID=7,CourseID=1,StudentScore=96},new Score{ StudentID=8,CourseID=1,StudentScore=97},new Score{ StudentID=9,CourseID=1,StudentScore=98}};scoreList.ForEach(s => context.Scores.Add(s));context.SaveChanges();}}

   根据上述类,我们就可以显式调用initLoad方法,创建一些测试数据,有了这些测试数据,我们就可以进行EF增删改查操作了。

   如果您还没能够成功创建数据库,请参考鄙人的上篇博客:EF CodeFirst 创建数据库,关于创建数据库的问题不作讲述。嘻嘻

   1、查询数据:

   1.1方法(循环加载并转化为List<T>):

        public ActionResult Index()//查询学生数据
        {List<Student> studentList = new List<Student>();foreach (var student in db.Students){studentList.Add(student);}return View(studentList);}

   1.2方法(LINQ 查询):

        public ActionResult Index()//查询学生数据
        {var StudentQuery = from b in db.Students select b;//IEnumerable 类型return View(StudentQuery);}

   1.3方法(将DbSet<T>转化为List<T>):

        public ActionResult Index()//查询学生数据
        {return View(db.Students.ToList());}

   1.4方法(原生态查询),在贴出代码之前,我们先认知下DbSet<T>类型

   

    由上图可知:DbSet<T>继承了IEnumerable类型,而我们知道LInq查询的初始结果就是IEnumerable类型,所以:我们直接返回DBSet<T>类型也是可以的,因此:有了如下查询:

        public ActionResult Index()//查询学生数据
        {return View(db.Students);}

   由上图可知:Add代表增加一个实体,Remove代表删除一个实体,Find代表根据主键查询一个实体,在此:我们对此三种方法不作解释,我们继续寻找查询方法:红色标注最后一个SqlQuery方法如何用呢?

   1.5方法(SqlQuery查询)

        public ActionResult Index()//查询学生数据
        {return View(db.Students.SqlQuery("select * from Student"));}

   1.6方法(IQueryable查询)注:根据上图,DbSet<T>也继承了这个东东,所以我们的查询结果也可以以这个东东为类型

        public ActionResult Index()//查询学生数据
        {using (StudentContext dv = new StudentContext()){IQueryable<Student> query = dv.Students.Where(d => d.Name.Contains(""));return View(query);}}

   1.7方法(Find查询),上述截图我们看到Find(参数)方法,其实他是根据主键来进行查询的,这个方法也很简单,代码如下:

        /// <summary>/// Find 根据主键查询  返回学生学号/// </summary>/// <returns></returns>public string Index(int Id=1){using (StudentContext dv = new StudentContext()){return dv.Students.Find(Id).StudentNum;}}

   至此:EF查询的方法也就讲的差不多了,下面我们来研究下删除的用法,所谓删除就是Remove(Tentity entity)方法和RemoveRange(IEnumerable<TEntity> entities)方法

   2、删除数据:根据上述Remove方法

   2.1方法(删除一个实体)

        /// <summary>/// 删除/// </summary>/// <param name="Id"></param>/// <returns></returns>public string Index4(int Id = 9)//删除Id为9的 陈丽阳 童鞋
        {using (StudentContext dv = new StudentContext()){Student mol=dv.Students.Find(Id);if (mol != null){dv.Students.Remove(mol); dv.SaveChanges();return "删除成功";}else{return "删除失败";}}}

   2.2方法(删除实体集合) 上图中的:RemoveRange(IEnumerable<TEntity> entities)方法

        /// <summary>/// 删除/// </summary>/// <param name="Id"></param>/// <returns></returns>public string Index4(int Id = 9)//删除姓王的童鞋
        {using (StudentContext dv = new StudentContext()){var studentMol = db.Students.Where(d => d.Name.Contains(""));if (studentMol != null){dv.Students.RemoveRange(studentMol); dv.SaveChanges();return "删除成功";}else{return "删除失败";}}}

   到此:删除也就讲完了,下面我们继续增加的方法:

   3、增加(ADD方法和AddRange方法)

   咱们继续看上图哈,其实Add方法的参数类型和Remove方法的参数类型一样,AddRange方法的参数类型和RemoveRange方法的参数类型一样,有了删除的相关知识,想必增加的方法大家也都会写了

   3.1方法(Add方法)

        /// <summary>/// Add/// </summary>/// <param name="Id"></param>/// <returns></returns>public string Index6()//
        {using (StudentContext dv = new StudentContext()){Student mol = new Student(){Name="陈卧龙",Sex="",StudentNum="081309099"};dv.Students.Add(mol);dv.SaveChanges();return "OK";}}

   3.2方法(AddRange方法)

       /// <summary>/// AddRange/// </summary>/// <param name="Id"></param>/// <returns></returns>public string Index6()//
        {using (StudentContext dv = new StudentContext()){var studentList = new List<Student>{new Student{Name = "陈大龙", Sex = "", StudentNum = "081309211"},new Student{Name = "陈小龙", Sex = "", StudentNum = "081309212"}};dv.Students.AddRange(studentList);dv.SaveChanges();return "OK";}}

   到此为止增加的方法也就被我们KO了,下面最后一个Update方法,一贯的概念,在更新之前,必须先找到这个对象,然后在更新这个对象

   4、Update方法:

        /// <summary>/// 更新/// </summary>/// <param name="Id"></param>/// <returns></returns>public string Index5(int Id = 1)//将Id等于1的人 姓名由陈依依 改成 陈二二
        {using (StudentContext dv = new StudentContext()){Student mol = dv.Students.Find(Id);if (mol != null){mol.Name = "陈二二";dv.SaveChanges();return "更新成功";}else{return "无值可更新";}}}

   至此:EF 增删改查也就全部被我们KO了。

   我们都知道数据库连接执行相关操作后,我们要及时释放数据库资源,在此:参照MSDN上的方法:如下

        /// <summary>/// 释放数据库资源 断开连接/// </summary>/// <param name="disposing"></param>protected override void Dispose(bool disposing){db.Dispose();base.Dispose(disposing);}

   最后,谢谢大家的耐心阅读,如果觉得还不错,就给个赞吧!谢谢!

   @陈卧龙的博客

这篇关于EF CodeFirst增删改查之‘CRUD’的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418276

相关文章

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

08 增删查功能

划重点: lable 标签keyup:键盘事件标签内添加样式:style使用事件修饰符:preventforEach :遍历 数组indexOf: 可以返回要查询的某个字符串值在整个字符串中首次出现的位置下标findIndex:返回传入一个测试条件(函数)符合条件数组的首个元素的位置splice:向/从数组中添加/删除项目,然后返回被删除后的新的项目数组 黑椒蟹 一对: <!DOCTYPE

SpringBoot项目-实现简单的CRUD功能和分页查询

背景 本博文主要是创建了一个新的SpringBoot项目,实现基本的增删改查,分页查询,带条件的分页查询功能。是方便初学者学习后端项目的一个比较清晰明了的实践代码,读者可根据博文,从自己动手创建一个新的SpringBoot项目,到使用PostMan测试基本请求,完完全全实践一遍,写出自己的代码,或者实现自己想要的功能。因为在这个过程中会遇到许多的问题,从JDK的版本选择到跑通SpringBo

JSP的增删改查part2

增加显示数据库表格cdsn的功能 1. 》》对CdsnDao接口和方法,CdsnService接口和方法进行处理,并增加CdsnServlet用于对新建展示页面进行处理 对cdsnDao接口和方法增加 》》接口 //获取cdsn用户数据列表 public List<cdsn> getCdsnList();》》CdsnDaoImpl增加内容//获得数据库所有数据publ

JSP的增删改查part1

运用Myeclisp对数据库进行增删改查 要建立6个库 1).其中dao层用与连接数据库和对数据库进行相关操作; 2).entity层用于存放数据库连接后的实体数据; 3.)service层是在mcv三层模式中新添加一层,能够更加清晰的定义应用程序的边界,需要操作数据的时候,通过service层访问DAO层来实现。

[含视频和源码]CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)

关说不练假把式,在上一,二篇中介绍了我心目中的CRUD的样子 基于之前的理念,我开发了一个命名为PasteTemplate的项目,这个项目呢后续会转化成项目模板,转化成项目模板后,后续需要开发新的项目就可以基于这个模板创建,这样就不要copy一个旧的项目,然后删删删,改改改,重命名等操作了 强迫症,一个项目的名字就得统一,心里才舒服 那么本次作者就带来了实物,本次主要介绍管理端的内容,我们一起

3.MyBatis源码解析-CRUD执行流程--阿呆中二

CRUD执行流程 MyBatisCRUD执行流程与我联系 MyBatis 本文是对mybatis 3.x源码深度解析与最佳实践学习的总结,包括XML文件解析流程、SqlSession构建流程、CRUD执行流程、MyBatis扩展点,以及针对面试题进行源码分析。 mybatis 3.x源码深度解析与最佳实践下载:https://download.csdn.net/downloa

CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)

关说不练假把式,在上一,二篇中介绍了我心目中的CRUD的样子 基于之前的理念,我开发了一个命名为PasteTemplate的项目,这个项目呢后续会转化成项目模板,转化成项目模板后,后续需要开发新的项目就可以基于这个模板创建,这样就不要copy一个旧的项目,然后删删删,改改改,重命名等操作了 强迫症,一个项目的名字就得统一,心里才舒服 那么本次作者就带来了实物,本次主要介绍管理端的内容,我们一起

QT QxOrm CRUD增删改查mysql数据库操作

QT QxOrm CRUD增删改查mysql数据库操作 QxOrm 是一个 C++ 库,旨在为 C++ 用户提供对象关系映射 (ORM) 功能。 基于每个类的简单 C++ 设置函数(如 Java 中的 Hibernate XML 映射文件),QxOrm 库提供以下功能: 持久性: 支持最常见的数据库,如 SQLite、MySQL、PostgreSQL、Oracle、MS SQL Server、Mo