使用EntityFramework6完成增删查改CRUD和事务
使用EntityFramework6完成增删查改和事务
上一节我们已经学习了如何使用EF连接MySQL数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详细讲解一下。
使用EF对数据库进行操作,整个过程就像操作数组一样,我们只管修改或向集合中添加值,最后通知EF保存修改后的结果就可以了。
准备工作
为了演示,我在数据库中建了两张表。class表用于表示班级,class_id是班级编号,class_name是班级名称。第二张表是学生表student,student_id为学生编号,name为姓名,age为年龄,class_id是学生所属班级,student表中的class_id与class表中的class_id存在外联关系。
数据库建好后,按照上一节介绍的步骤我们直接通过向导来生成EF代码。
执行完成后VS为我们生成了三个类,分别是DBModel、_class、student,其中DBModel代表的是数据库,而_class和student则分别代表班级表和学生表。
先来看看DBModel类,DBModel相当于一个数据库,之后你new一个DBModel就相当于打开了一次数据库,跟数据库建立了一次连接。
再来看看student与_class类。类中的属性上添加很多特性(Attribute),用于描述数据约束。值得注意的是在student类中,EF将我们的外键class_id分解成了两个属性,其中_class前面使用了virtual关键字,使用了virtual关键字描述的属性在查询时并不会马上从数据库中读取数据,而是当你真正需要用到它的值时再单独从数据库中查询出来。
使用EF读取数据
我先在学生表中添加了一些数据。
接下来让我们使用EF来查询年龄大于10岁的同学的学号、姓名、年龄、班级名称。
- class Program
- {
- static void Main(string[] args)
- {
- using (var db = new DBModel())
- {
- var result = from i in db.students //使用LINQ查询年龄大于10岁的学生
- where i
- select i;
- foreach (var student in result)
- {
- Console.WriteLine("学号:" + student.Student_id + " 姓名:" + student.name
- + " 年龄:" + student.age + " 班级名称:" + student._class.class_name);
- }
- Console.Read();
- }
- }
- }
其中使用了LINQ,对LINQ不熟的可以看看这篇文章。
使用EF添加数据
向数据库中添加数据就跟往List<>集合添加数据一样,不过最后需要调用SaveChanges()向数据库保存一下数据。
- class Program
- {
- static void Main(string[] args)
- {
- using (var db = new DBModel())
- {
- var s = new student();
- //因为数据库中的student_id是自动增长的所以可以不用赋值
- s.name = "张三";
- s;
- s;
- db.students.Add(s);
- db.SaveChanges(); //将修改保存到数据库中
- }
- }
- }
使用EF修改数据
先查询出你要修改的那条数据,之后直接更改其中的值就可以了。
- class Program
- {
- static void Main(string[] args)
- {
- using (var db = new DBModel())
- {
- var student = db.students.FirstOrDefault(s => s.name == "萝莉");
- student; //将萝莉的年龄改为13岁
- db.SaveChanges();
- }
- }
- }
使用EF删除数据
使用EF删除数据就和在List<>集合中删除元素一样
使用TransactionScope
- class Program
- {
- static void Main(string[] args)
- {
- using (var db = new DBModel())
- {
- var student = db.students.FirstOrDefault(s => s.name == "萝莉"); //查找萝莉
- db.students.Remove(student); //删除萝莉
- db.SaveChanges();
- }
- }
- }
在EF使用事务
事务就是确保一次数据库操作,所有步骤都成功,如果哪一步出错了,整个操作都将回滚。
在EF使用事务有两种方案,一种是EF自带的.BeginTransaction()方法,另一种是使用TransactionScope类。
使用.BeginTransaction()
使用.BeginTransaction()实现事务
- class Program
- {
- static void Main(string[] args)
- {
- using (var db = new DBModel())
- {
- var tran = db.Database.BeginTransaction(); //开启事务
- try
- {
- var student = db.students.FirstOrDefault(s => s.name == "萝莉");
- db.students.Remove(student); //删除萝莉
- db.SaveChanges();
- tran.Commit(); //必须调用Commit(),不然数据不会保存
- }
- catch (Exception ex)
- {
- tran.Rollback(); //出错就回滚
- }
- }
- }
- }
使用TransactionScope类
使用之前记得引入System.Transactions.dll
使用TransactionScope
- class Program
- {
- static void Main(string[] args)
- {
- using (var db = new DBModel())
- {
- using (var tran = new TransactionScope()) //开启事务
- {
- var student = db.students.FirstOrDefault(s => s.name == "萝莉");
- db.students.Remove(student); //删除萝莉
- db.SaveChanges();
- tran.Complete(); //必须调用.Complete(),不然数据不会保存
- } //出了using代码块如果还没调用Complete(),所有操作就会自动回滚
- }
- }
- }
两种都可以,不过我觉得使用TransactionScope要方便一点。
到此使用EF6实现CRUD以及事务就介绍完了,下一节我们再来讨论一下如何在EF执行SQL,以实现更加灵活的数据操作。
出处:http://www.cnblogs.com/wujingtao/p/5407821.html
使用EntityFramework6完成增删查改CRUD和事务的更多相关文章
- 使用EntityFramework6完成增删查改和事务
使用EntityFramework6完成增删查改和事务 上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详细讲解一下. 使用EF对数据库进行操作, ...
- 用EntityFramework6完成增删查改和事务【转】
http://www.cnblogs.com/wujingtao/p/5407821.html 上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详 ...
- 2016/3/13 MySQL 增删查改 CRUD 用代码实现
用代码实现数据库数据输入 T-SQL语句 查询语句分几块 ①创建表 create table Car (Code varchar(50) primary key, #primary key 主键 定义 ...
- java中CRUD(增删查改)底层代码的实现
java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...
- 极极极极极简的的增删查改(CRUD)解决方案
去年这个时候写过一篇全自动数据表格的文章http://www.cnblogs.com/liuyh/p/5747331.html.文章对自己写的一个js组件做了个概述,很多人把它当作了一款功能相似的纯前 ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- 3.EF 6.0 Code-First实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-entity-framework-5-0-code- ...
- 4.在MVC中使用仓储模式进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 系列目录: ...
- 5.在MVC中使用泛型仓储模式和工作单元来进行增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
随机推荐
- UVA-10689 Yet another Number Sequence (矩阵二分幂模板)
题目大意:已知递推公式和边缘值,求某项的最后m(0<m<5)位数字. 题目分析:矩阵二分幂的模板题. 代码如下: # include<iostream> # include&l ...
- Centos7 docker 常用指令
Docker 运行在 CentOS 7 上,要求系统为64位.系统内核版本为 3.10 以上 一.docker的安装及卸载 1.查看当前系统内核版本: [root@docker ~]# uname - ...
- 网络SSID是什么意思
ssid是网络的ID(名称).一般用在无线网络上.搜索无线网络名一般就是在搜索无线网络的ssid. SSID是Service Set Identifier的缩写,意思是:服务集标识.SSID技术可以将 ...
- maven相关资源
http://mvnrepository.com/search?q= http://maven.aliyun.com/nexus/#welcome https://www.w3cschool.cn/m ...
- Win32.com安装
Win32.com安装 http://sourceforge.net/projects/pywin32/files/pywin32
- SQL Server 调优系列基础篇 - 并行运算总结(二)
前言 上一篇文章我们介绍了查看查询计划的并行运行方式. 本篇我们接着分析SQL Server的并行运算. 闲言少叙,直接进入本篇的正题. 技术准备 同前几篇一样,基于SQL Server2008R2版 ...
- hdu4348
题解: 因为卡空间,所以直接到spoj上面去做了 区间修改的线段树 但是加lazy会把之前的操作修改 正确的解法是lazy不下传,只是在当前计算 但是听说可以记录时间的下传,我弱弱不会 代码: #in ...
- DevExpress v18.1新版亮点——WPF篇(二)
用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WPF v18.1 的新功能,快来下载试用新版本!点击下载& ...
- 打开WORD文档出错提示
打开WORD文档出错提示: Microsoft Office Word 遇到问题需要关闭.我们对此引起的不便表示抱歉. 您正在处理的信息有可能丢失.Microsoft Office Word 可以尝试 ...
- 如何把dos命令窗口里的字符复制下来?
简单一点的操作就是右键点“标记”选中需要复制的内容点左上角的小图标 编辑 复制