使用EntityFramework6完成增删查改和事务
使用EntityFramework6完成增删查改和事务
上一节我们已经学习了如何使用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;
- 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<>集合中删除元素一样
- 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()
- 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
- 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完成增删查改和事务【转】
http://www.cnblogs.com/wujingtao/p/5407821.html 上一节我们已经学习了如何使用EF连接数据库,并简单演示了一下如何使用EF6对数据库进行操作,这一节我来详 ...
- 使用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 ...
随机推荐
- C#实现的18位身份证格式验证算法
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999<公民身份号码>中做了明确的规定. GB11643-1999<公民身份号码>为GB1164 ...
- ASP.NET MVC进阶二
一.数据验证 数据验证的步骤 在模型类中添加与验证相关的特性标记 在客户端导入与验证相关的js文件和css文件 使用与验证相关的Html辅助方法 在服务器端判断是否通过服务器端验证 常用的验证标记 R ...
- Linux修改命令提示符(关于环境参量PS1)
关乎环境参量的四个文件/etc/profile /etc/bashrc ~/.bashrc ~/.bash_profile $$$:/etc/profile:此文件为系统的每个用户设置环境信息,当 ...
- python爬虫——爬取NUS-WIDE数据库图片
实验室需要NUS-WIDE数据库中的原图,数据集的地址为http://lms.comp.nus.edu.sg/research/NUS-WIDE.htm 由于这个数据只给了每个图片的URL,所以需 ...
- phantomjs 另类用法
这几天接到了一个数据采集的项目 通过对网站的前期分析得到以下内容 1.网站本身采用.NET开发 2.需抓取内容采用DES加密 虽然得到了前端javascript的加解密算法,但大家也知道跨语言算法想要 ...
- 中国快递包裹总量的预测-基于SARIMA模型
code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...
- 亲们! 首次见面! 带来不适!多多见谅!--------->>Bank系统
亲们!您们好! 讲一下Bank系统的做法: 01.首先创建一个Card类 using System; using System.Collections.Generic; using System.Li ...
- EntityFramework4.1开发
常见问题大概为这几个 一.ef4.1 codeFirst 修改表结构 增加字段等 EF code first需要重新生成库导致数据丢失的问题. 二.ef4.1 没有了edmx等复杂的东西 变得简单 干 ...
- 人人都应该学习Markdown
Markdown是一门新兴的标记语言,已经有12年历史了.随着它在全球范围内的流行,很多人已经听说.熟识或者开始使用了. 首先,Markdown既不是工具,也不是程序语言,而是一种十分轻量级的标记语言 ...
- C#源码500份
C Sharp 短信发送平台源代码.rar http://1000eb.com/5c6vASP.NET+AJAX基础示例 视频教程 http://1000eb.com/89jcC# Winform ...