Entity Framework 学习系列(4) - EF 增删改
写在前面
在上一小节中,学习了如何 通过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(); }
}
}
Entity Framework 学习系列(4) - EF 增删改的更多相关文章
- Entity Framework 学习系列(5) - EF 相关查询
目录 写在前面 一.使用Stopwatch 查询执行效率 二.简单查询 1.Linq写法: 2.Lambda表达式写法: 三.条件查询 1.Linq 写法 2.lambda 写法 四.聚合函数 1.L ...
- EF(Entity Framework)通用DBHelper通用类,增删改查以及列表
其中 通用类名:DBhelper 实体类:UserInfo 1 //新增 2 DBHelper<UserInfo> dbhelper = new DBHelper<UserInfo& ...
- 使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序
使用ASP.NET Core MVC 和 Entity Framework Core 开发一个CRUD(增删改查)的应用程序 不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻 ...
- EF学习笔记-1 EF增删改查
首次接触Entity FrameWork,就感觉非常棒.它节省了我们以前写SQL语句的过程,同时也让我们更加的理解面向对象的编程思想.最近学习了EF的增删改查的过程,下面给大家分享使用EF对增删改查时 ...
- 基于Entity Framework的自定义分页,增删改的通用实现
简介 之前写个一个基于Dapper的分页实现,现在再来写一个基于Entity Framework的分页实现,以及增删改的通用实现. 代码 还是先上代码:https://github.com/jinwe ...
- Entity Framework 学习系列(3) - MySql Code First 开发方式+数据迁移
目录 # 写在前面 一.开发环境 二.创建项目 三.安装程序包 四.创建模型 五.连接字符串 六.编辑程序 七.数据迁移 写在最后 # 写在前面 这几天,一直都在学习Entity Framework ...
- Entity Framework 学习系列(1) - 认识理解Entity Framework
目录 写在前面 什么是Entity Framework EF的优缺点 1.优点 2.缺点 如何理解ORM EF执行的原理 写在前面 在使用.net mvc 开发的时候.为了高效的开发,我们常常会搭配O ...
- Entity Framework学习笔记——配置EF
初次使用Entity Framework(以下简称EF),为了避免很快忘记,决定开日志记录学习过程和遇到的问题.因为项目比较小,只会用到EF的一些基本功能,因此先在此处制定一个学习目标:1. 配置EF ...
- Entity Framework 学习系列(2) - MySql Database First 开发方式
目录 写在前面 环境 下载MySQL连接工具 创建Databse First 1.创建控制台 2.创建数据库 3.安装 MySQL.Data 和MySQL.Data.Entity 3.在项目中添加数据 ...
随机推荐
- MySQL循环日期
DROP PROCEDURE IF EXISTS `insertManyDate`$$ CREATE DEFINER=`root`@`%` PROCEDURE `insertManyDate`(IN ...
- docker的8个使用场景
1.简化配置 虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件, 系统), Docker在降低额外开销的情况下提供了同样的功能. 它能让你将运行环境和配置放在代码汇总然后部署, 同一 ...
- JSP 与Javabean 的交互技术
JSP 与Javabean 的交互技术 JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性.每个属性通常都需要具有相应的setter. getter方法,setter方法称为 ...
- 1_ZedBoard开发板测试
启动 将SD卡插入电脑进行格式化 格式化时,要将SD卡格式化为FAT32文件系统.块大小格式化为4096字节时后面会出现无法启动的情况,可以先复现一下这个错误.块大小我选择4096字节. 然后将Zed ...
- Unity检视面板的继承方法研究 (二)
之前做了普通对象的可继承的检视面板类, 现在想要实现对Unity自带的检视面板的继承的话, 要怎样写呢? 万变不离其宗, 仍然是围绕UnityEditor.Editor.CreateEditor 这 ...
- python3中的map对象返回的是迭代器,该迭代器用list()转列表之后,再次用list()转化时会返回空
练习代码的时候,发现python3中的map()函数返回的可迭代对象,在用list()转成列表之后,再次用list()转列表的时候,获取的是空值(如下所示),所以查了一下python3的map()对象 ...
- 搭建稳固的MySQL运维体系
MySQL 监控要点 MySQL 监控要点,主要涉及服务器和 MySQL 两个方向的监控告警. 在这两个监控告警方向需要重点关注监控策略.监控趋势图及报警方式. 监控策略指的是每个监控项的告警阈值,例 ...
- 【使用篇二】SpringBoot热部署(11)
热部署有三种方式: SpringLoader 插件 DevTools 工具 安装JRebel插件 注意:热部署的功能依赖于工具的自动编译,Eclipse-->Build Automaticall ...
- 【使用篇二】SpringBoot单元测试(10)
SpringCloud单元测试:https://www.cnblogs.com/myitnews/p/11796321.html 1. 创建项目Maven Project,修改pom.xml < ...
- 接口规范、容错处理规则、aph备份数据规则
前话:前后解耦,前端开发环节使用APH,后台开发环节postman(可考虑为后台也做一个aph后台版) 1.api标准:标识符(ret:1为正常数据,0为接口报错),数据体(data:api的数据容器 ...