用EntityFramework6完成增删查改和事务【转】
http://www.cnblogs.com/wujingtao/p/5407821.html
上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用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.age = 15;
- s.class_id = 1;
- 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.age = 13; //将萝莉的年龄改为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,以实现更加灵活的数据操作。
用EntityFramework6完成增删查改和事务【转】的更多相关文章
- 使用EntityFramework6完成增删查改和事务
		使用EntityFramework6完成增删查改和事务 上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详细讲解一下. 使用EF对数据库进行操作, ... 
- 使用EntityFramework6完成增删查改CRUD和事务
		使用EntityFramework6完成增删查改和事务 上一节我们已经学习了如何使用EF连接MySQL数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详细讲解一下. 使用EF对数据库 ... 
- Yii2使用数据库操作汇总(增删查改、事务)
		查询 //1.简单查询 $admin=Admin::model()->findAll($condition,$params); $admin=Admin::model()->findAll ... 
- Dapper基础增删查改、事务和存储过程
		1.前言 Dapper是一个轻量级的orm框架,上手也非常的简单,它可以实体映射,所以先准备实体如下: public class Couser { public int id { get; set; ... 
- hibernate基础增删查改简单实例
		hibernate 基础理论知识网上很多,可以百度和google.这里不做多的介绍,以一个User表来开展例子 建一个web-project 我这里用了junit单元测试环境来进行增删查改的测试,别的 ... 
- 利用dbutils工具实现数据的增删查改操作(dbutis入门)
		一.前期准备 1.安装数据库(如:mysql5.5) 2.安装Eclipse(如:3.4) 3.下载数据库驱动包 4.下载dbutis工具包 5.在Eclipse创建名为 dbutils 的工程并在工 ... 
- SSH框架的多表查询和增删查改 (方法一)中
		原创作品,允许转载,转载时请务必标明作者信息和声明本文章==>http://www.cnblogs.com/zhu520/p/7774144.html 这边文章是接的刚刚前一遍的基础上敲的 ... 
- SSH框架的多表查询(方法二)增删查改
		必须声明本文章==>http://www.cnblogs.com/zhu520/p/7773133.html 一:在前一个方法(http://www.cnblogs.com/zhu520/p ... 
- java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)
		1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件 准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ... 
随机推荐
- [转]Splay算法
			首先声明,本教程的对象是完全没有接触过splay的OIer,大牛请右上角. 先看一道题目: skydec有n个数,每次他都会把一些数放进一些盒子里,由于skydec太傻×,所以他不能判断数的大小,现在 ... 
- Eth-Trunk链路聚合配置
			Eth-Trunk概述 Eth-Trunk接口能够实现负载分担.增加带宽和提高可靠性 Eth-Trunk接口把多个物理接口捆绑成一个逻辑接口 Eth-Trunk接口的链路聚合模式 链路聚合模式 应用场 ... 
- collectionFramwork-1
			1. Set.List和Map可以看做集合的三大类. List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问. Set集合是无序集合,集合中的元素不可以重复,访问集合中 ... 
- 基于ETL技术的数字化校园共享数据中心设计
			摘要:数据的抽取.转换与加载(ETL)是数据整合的核心过程.在分析高校信息化建设现状基础上,以建立数字化校园.整合数据资源.实现数据共享为目标,提出以ETL为基础建立共享数据中心实现数据整合的方案.介 ... 
- 网页图表Highcharts实践教程标之添加题副标题版权信息
			网页图表Highcharts实践教程标之添加题副标题版权信息 Highcharts辅助元素 辅助元素图表的非必要元素,如标题.版权信息.标签.载入动态.它们不和图表数据发生关联,只是额外说明一些基本信 ... 
- 格式化p6spy的输出日志
			众所周知, p6spy打印出来的日志是一行很长很长的内容, 很不容易查看, 牛B的p6spy为什么就不能想hibernate那样有format_sql的功能? 竟然没有, 我只好自己动手写一个日志输出 ... 
- 关于输出螺旋矩阵的demo
			输出类似 1 2 3 8 9 4 7 6 5 主要难点是如何找到表示的算法 我的理解是,先生成一个n*n的矩阵,然后再往里面塞数字,而塞的方法分别有四种:由左往右,由上往下,由右往左,由下往上,没塞完 ... 
- [原创] 浅谈ETL系统架构如何测试?
			[原创] 浅谈ETL系统架构如何测试? 来新公司已入职3个月时间,由于公司所处于互联网基金行业,基金天然固有特点,基金业务复杂,基金数据信息众多,基金经理众多等,所以大家可想一下,基民要想赚钱真不容易 ... 
- .net core在Linux ARM板上运行
			最近接了个临时任务,给别的项目组的机器人平台上开发个小程序,那机器人上跑的是ARM平台,ubuntu的系统. 本来打算用C++写的,由于最近用.net core较多,鉴于其在linux平台良好的兼容性 ... 
- JTAG - General description of the TAP Controller states
			A transition between the states only occurs on the rising edge of TCK, and each state has a differen ... 
