Entity Framework 学习系列(4) - EF 增删改

mac2022-06-30  71

目录

写在前面一、开发环境二、创建项目三、新增 1.单表新增2.批量新增3.多表新增四、编辑 1.先查询,后编辑2.创建实体,后编辑五、删除

写在前面


在上一小节中,学习了如何 通过Code First + MySql 的方式实现数据的迁移。

这一下节中,总结 EF的增删改。

一、开发环境


开发工具:Visual Studio 2019

开发环境:Win 10 家庭版

数据库:MySQL 8.0.17

二、创建项目


1.打开Visual Studio 2019 新建->创建程序台应用

2.安装 MySQL.Data 6.10.9

工具->NuGet包管理器->管理解决方案的NuGet程序包->浏览

3.安装 MySQL.Data.Entity 6.10.9

工具->NuGet包管理器->管理解决方案的NuGet程序包->浏览

4.创建Categories类型表以及Shippers供应商表

Categories 类型表 using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace myEFCodeFirst_04.Models { public class Categories { [Description("类型ID")] [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int CategoryId { get; set; } [Description("类型名称")] public string CategoryName { get; set; } [Description("类型说明")] public string Description { get; set; } [Description("创建时间")] public DateTime createTime { get; set; } } } Shippers 供应商表 using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace myEFCodeFirst_04.Models { [Description("供应商")] public class Shippers { [Description("供应商Id")] [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int ShipperId { get; set; } [Description("供应商名称")] public string CompanyName { get; set; } [Description("电话号码")] public string Phone { get; set; } } }

5.使用Code First 方式创建上下文类

using myEFCodeFirst_04.Models; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; namespace myEFCodeFirst_04 { //选择MySQL数据 [DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class DatabaseContext:DbContext { public DatabaseContext() : base("name=MqConn") { } public DbSet<Productus> productus { get; set; } public DbSet<Categories> categories { get; set; } public DbSet<Shippers> shippers { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();//移除复数表名的契约 } } }

6.打开App.config修改连接字符串

<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"> <parameters> <parameter value="mssqllocaldb" /> </parameters> </defaultConnectionFactory> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.10.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"/> </providers> </entityFramework> <connectionStrings> <add name="MqConn" connectionString="Data Source=localhost;User Id=root;Password=root;database=EFFirstCodeDb;" providerName="MySql.Data.MySqlClient"/> </connectionStrings> </configuration>

7.实现数据迁移

工具->NuGet包管理器->NuGet包管理器控制台

输入命令:Enable-Migrations 在项目中自动自动创建了Migrations文件夹

输入命令:Add-Migration Initials 初始化数据

输入命令:update-database 更新数据库

至此,项目的前期准备完成。接下来完成,数据的的基本操作。

三、新增


1.单表新增

使用Add() 方法执行添加 static void Add() { //1.声明上下文依赖 using (DatabaseContext _db = new DatabaseContext()) { //2.声明对象,初始化数据 Shippers sip = new Shippers { ShipperId = 1, CompanyName = "中山有限公司", Phone = "17818979133" }; //3.附加到EF中 _db.shippers.Add(sip); //4.执行新增操作 if (_db.SaveChanges() > 0) { Console.WriteLine("添加成功"); Console.ReadKey(); } else { Console.WriteLine("添加失败!"); Console.ReadKey(); } } } 使用Entry() 方法进行添加 static void Add(){ //1.声明上下文依赖 using(DatabaseContext _db=new DatabaseContext()) { //2.声明对象,初始化数据 Shippers sip = new Shippers { ShipperId = 1, CompanyName = "中山有限公司", Phone = "17818979133" }; //3.使用Entity需要引用 using System.Data.Entity.Infrastructure; DbEntityEntry<Shippers> sp=_db.Entry<Shippers>(sip); //4.需要引用 using.Data.Entity; sp.State=EntityState.Added; //5.执行添加 if (_db.SaveChanges() > 0) { Console.WriteLine("添加成功"); Console.ReadKey(); } else { Console.WriteLine("添加失败!"); Console.ReadKey(); } } }

2.批量新增

static void batchAdds() { //1.声明上下文依赖 using(DatabseContext _db=new DatabaseContect()) { //2.开始循环 for (int i = 0; i < 30; i++) { //3.声明实体对象 Shippers batchs = new Shippers { CompanyName = "供应商" + i, Phone = "供应商电话" + i, }; //4.附加到EF中 _db.shippers.Add(batchs); } //5.执行批量操作 if (_db.SaveChanges() > 0) { Console.WriteLine("批量添加成功"); Console.ReadKey(); } else { Console.WriteLine("批量添加失败"); Console.ReadKey(); } } }

3.多表新增

static void Adds() { //新增1 Shippers sip = new Shippers { ShipperId = 2, CompanyName = "中山文莱有限公司", Phone = "17818978114" }; //1.声明上下文依赖 using(DatabaseContext _db=new Database()) { _db.shippers.Add(sip); //2.新增数据2 Categories cats = new Categories { CategoryId = 1, CategoryName = "休闲鞋", Description = "休闲鞋是鞋类的一种,主要特色是以一种简单,舒适的设计理念,满足人们日常生活穿着的需求", createTime = DateTime.Now }; //附加到EF中 _db.categories.Add(cats); //3.修改 //查询一个需要修改的对象,此时返回的是一个代理类型对象 Shippers editsps = new Shippers { ShipperId = 1, CompanyName = "中山" }; //将对象加入EF容器 DbEntityEntry<Shippers> entity = _db.Entry<Shippers>(editsps); //获取当前实体对象的状态管理对象 entity.State = EntityState.Unchanged; //设置改对象 某属性 为修改状态,同时 entity,state 被修改为modified状态 entity.Property("CompanyName").IsModified = true; //4.删除 //构建删除对象 Categories delcts = new Categories { CategoryId = 1 }; //附加到EF中 _db.categories.Attach(delcts); //标记为删除 _db.categories.Remove(delcts); //执行操作 if (_db.SaveChanges() > 0) { Console.WriteLine("成功"); Console.ReadKey(); } else { Console.WriteLine("失败"); Console.ReadKey(); } } }

四、编辑


1.先查询,后编辑

static void QueryEdit() { using (DatabaseContext _db = new DatabaseContext()) { //1.查询一个需要修改的对象,此时返回的是一个代理类型对象 Categories qycts = _db.categories.Where(c => c.CategoryId == 1).FirstOrDefault(); //2.编辑内容 此时其实操作的是代理类型对象的属性,这些属性会将值设置给内部的对象 //对应的属性,同时标记此属性已修改状态 Console.WriteLine("编辑之前:" + qycts.CategoryName); //3.重新保存到数据库 //注意:此时EF上下文会检查容器内部所有的对象,先找到标记 //为修改的对象,然后找到标记为修改的对象属性,生成对应的Update语句执行 qycts.CategoryName = "供应商1"; if (_db.SaveChanges() > 0) { Console.WriteLine("编辑成功"); Console.ReadKey(); } else { Console.WriteLine("编辑失败"); Console.ReadKey(); } } }

2.创建实体,后编辑

方法1 static void CreateEdit() { using (DatabaseContext _db=new DatabaseContext()) { //1.创建对象 Categories Editcts = new Categories { CategoryId = 1, CategoryName = "修改类型名称", Description = "修改类型描述", createTime = DateTime.Now }; //2.将对象加入EF容器,并获取当前实体对象的状态管理对象 DbEntityEntry<Categories> EdEntity = _db.Entry<Categories>(Editcts); //3.设置对象为被修改过 dEntity.State = EntityState.Unchanged; //4.设置改对象 某属性 为修改状态,同时 entity,state 被修改为modified状态 EdEntity.Property("CategoryName").IsModified=true; //5.执行编辑操作 if (_db.SaveChanges() > 0) { Console.WriteLine("编辑成功"); Console.ReadKey(); } else { Console.WriteLine("编辑失败"); Console.ReadKey(); } } } 方法2 static void CreateEdit() { using (DatabaseContext _db=new DatabaseContext()) { //1.创建对象 Categories Editcts = new Categories { CategoryId = 1, CategoryName = "修改类型名称", Description = "修改类型描述", createTime = DateTime.Now }; //2.附加到EF中 var u = _db.categories.Attach(Editcts); //3.标记修改的字段 u.CategoryName = "修改类型名称"; //4.执行编辑操作 if (_db.SaveChanges() > 0) { Console.WriteLine("编辑成功"); Console.ReadKey(); } else { Console.WriteLine("编辑失败"); Console.ReadKey(); } } }

五、删除


方法1 static void Dels() { using (DatabaseContext _db = new DatabaseContext()) { //1.声明实体 Categories delcts = new Categories { CategoryId = 1 }; //2.附件到EF中 _db.categories.Attach(delcts); //3.标记为删除 _db.categories.Remove(delcts); //4.执行删除的sql if (_db.SaveChanges() > 0) { Console.WriteLine("删除成功"); Console.ReadKey(); } else { Console.WriteLine("删除失败"); Console.ReadKey(); } } } 方法2 static void Dels() { using(DatabaseContext _db=new DatabaseContext()) { //1.声明实体 Categories delcts = new Categories { CategoryId = 1 }; //2.将对象加入EF容器 DbEntityEntry<Categories> delsEntity = _db.Entry<Categories>(delcts); //3.获取当前实体对象的状态管理对象对应的属性,同时标记此属性已删除状态 delsEntity.State = EntityState.Deleted; //4.执行删除的操作 if (_db.SaveChanges() > 0) { Console.WriteLine("删除成功"); Console.ReadKey(); } else { Console.WriteLine("删除失败"); Console.ReadKey(); } } }

转载于:https://www.cnblogs.com/ZengJiaLin/p/11511671.html

相关资源:【全网首发】EntityFrameWork(EF)6.x 仓储扩展帮助类
最新回复(0)