EF 自测例子
public ActionResult Test()
{
using (MvcShoppingContext db = new MvcShoppingContext())
{
var objectContext = ((IObjectContextAdapter)db).ObjectContext; //用来解决 未启用MSDTC错误
try
{
objectContext.Connection.Open();
//设置事务超时时间
//TransactionOptions transactionOption = new TransactionOptions();
//transactionOption.Timeout = new TimeSpan(0, 1, 0); //设置为1分钟
//事务处理,默认:隔离级别为可序列化 (Serializable),事务的超时时间为 1 分钟
using (var scope = new TransactionScope())
{
//一、 单表增删改查
//1,增,--------------------------------------------------------
//Person p = new Person() { Name = "qjn", Age = 23, Gender = "female" };
//方法一
//db.Persons.Add(p);
//db.SaveChanges();
//方法二
//db.Persons.Attach(p);
//db.Entry<Person>(p).State = System.Data.EntityState.Added;
//db.SaveChanges();
//2,改,只要实体的ID就可以了 -------------------------------------------
//方法一、修改所有字段,不设置的字段将会变为类型的默认字段,如string 将为null
//Person p = new Person() { Id = 1, Name = "QinHua", Age = 30 };
//db.Persons.Attach(p);
//db.Entry<Person>(p).State = System.Data.EntityState.Modified;
//db.SaveChanges();
//方法二、先查寻出来,再修改。注意:会发生未启用MSDTC错误,请注意觖决办法
//Person p = db.Persons.SingleOrDefault(m => m.Id == 1);
//p.Name = "Qin Hua";
//p.Gender = "Male";
//db.SaveChanges();
//方法三、修改部份字段,
//Person p = new Person() { Id = 1, Name = "Hua", Age = 25 };
//db.Persons.Attach(p);
//var setEntry = ((IObjectContextAdapter)db).ObjectContext.ObjectStateManager.GetObjectStateEntry(p);
//setEntry.SetModifiedProperty("Name");
//setEntry.SetModifiedProperty("Age");
//db.SaveChanges();
//3, 删--------------------------------------------------
//Person p = new Person() { Id = 2 };
//db.Persons.Attach(p);
//db.Persons.Remove(p);
//db.SaveChanges();
//4,并发处理,如果两IE同时执行此方法,将只有一个成功,另一个出错--------------
//Person p = db.Persons.Where(m => m.Id == 3).SingleOrDefault();
//p.Name = "N-" + DateTime.Now.ToString("mm:ss");
//System.Threading.Thread.Sleep(3000);
//db.SaveChanges();
//并发冲突时的解决办法(fail):当发生冲突时,循环执行此过程。(当然还有其它方法),这个方法有问题,会引起事务中止
//int i = 0;
//int maxTimes = 3;
//bool isHaveError = false;
//do
//{
// isHaveError = false;
// try
// {
// Person p = db.Persons.Where(m => m.Id == 3).SingleOrDefault();
// p.Name = p.Name+" N-" + DateTime.Now.ToString("mm:ss");
// System.Threading.Thread.Sleep(3000);
// db.SaveChanges();
// }
// //catch (DbUpdateConcurrencyException ex)
// //catch (System.Data.OptimisticConcurrencyException ex)
// catch(DbUpdateException ex)
// {
// //当发生冲突时
// foreach (DbEntityEntry item in ex.Entries)
// {
// objectContext.Refresh(
// System.Data.Objects.RefreshMode.StoreWins, item.Entity);
// }
// //db.SaveChanges();
// isHaveError = true;
// i++;
// }
//} while (i < maxTimes && isHaveError);
//if (i >= maxTimes)
//{
// throw new Exception("并发测试,抛出异常,数据更新过程中发生了并发错误");
//}
//并发冲突解决2(right),由于是网站,所以用lock方式,(客户端软件可以考虑用数据库锁的方式)----------------------
//lock (lockObj)
//{
// Person p = db.Persons.Where(m => m.Id == 3).SingleOrDefault();
// p.Name = p.Name + " N-" + DateTime.Now.ToString("mm:ss");
// System.Threading.Thread.Sleep(3000);
// db.SaveChanges();
//}
//二、一对多、多对一关系处理
// 级联增 1,正向 [如果级联对象不存在,则会新增级联对象,否则不新增(如例2)]
//OrderH oh = new OrderH() { Name = "AA", OrderDs = new List<OrderD>() };
//OrderD od1 = new OrderD() { Price = 10 };
//OrderD od2 = new OrderD() { Price = 12 };
//oh.OrderDs.Add(od1);
//oh.OrderDs.Add(od2);
//db.OrderHs.Add(oh);
//db.SaveChanges();
// 级联增 2 ,加入到一个
//OrderH oh = db.OrderHs.Where(m => m.Id == 1).SingleOrDefault();
//OrderD od1 = new OrderD() { Price = 13, OrderH=oh };
//OrderD od2 = new OrderD() { Price = 14, OrderH = oh };
//db.OrderDs.Add(od1);
//db.OrderDs.Add(od2);
//db.SaveChanges();
// 级联增 2.2 ,加入到一个,[这样子会出错]
//OrderH oh = db.OrderHs.Where(m => m.Id == 5).SingleOrDefault();
//OrderD od1 = new OrderD() { Price = 13 };
//OrderD od2 = new OrderD() { Price = 14 };
//oh.OrderDs.Add(od1);
//oh.OrderDs.Add(od2);
//db.OrderHs.Add(oh);
//db.SaveChanges();
// 级联增 3,反向
//OrderH oh = new OrderH() { Name = "BB", OrderDs = new List<OrderD>() };
//OrderD od1 = new OrderD() { Price = 13, OrderH = oh };
//OrderD od2 = new OrderD() { Price = 14, OrderH = oh };
//db.OrderDs.Add(od1);
//db.OrderDs.Add(od2);
//db.SaveChanges();
// 级联增 4,各自保存各自的
//OrderH oh = new OrderH() { Name = "CC", OrderDs = new List<OrderD>() };
//OrderD od1 = new OrderD() { Price = 15, OrderH = oh };
//OrderD od2 = new OrderD() { Price = 16, OrderH = oh };
//db.OrderDs.Add(od1);
//db.OrderDs.Add(od2);
//db.OrderHs.Add(oh);
//db.SaveChanges();
// 级联增 5,各自保存各自的
//OrderH oh = new OrderH() { Name = "DD", OrderDs = new List<OrderD>() };
//OrderD od1 = new OrderD() { Price = 15, OrderH = oh };
//OrderD od2 = new OrderD() { Price = 16, OrderH = oh };
//oh.OrderDs.Add(od1);
//oh.OrderDs.Add(od2);
//db.OrderDs.Add(od1);
//db.OrderDs.Add(od2);
//db.OrderHs.Add(oh);
//db.SaveChanges();
//2,级联修改
//OrderH oh = db.OrderHs.Where(m => m.Id == 5).SingleOrDefault();
//OrderD od = null;
//foreach (var item in oh.OrderDs)
//{
// od = item;
// break;
//}
//oh.Name = "Modify";
//od.Price = 11;
//db.SaveChanges();
//3,级联删除
//只删除主键表是会出错的
//OrderH oh = db.OrderHs.Where(m => m.Id == 5).SingleOrDefault();
//db.OrderHs.Remove(oh);
//db.SaveChanges();
//只删除主键表是会出错的
//OrderH oh = new OrderH() { Id = 5 };
//db.OrderHs.Attach(oh);
//db.OrderHs.Remove(oh);
//db.SaveChanges();
//删除主表,并将子表的外键清空
//OrderH oh = db.OrderHs.Where(m => m.Id == 5).SingleOrDefault();
//OrderD od = null;
//foreach (var item in oh.OrderDs)
//{
// od = item;
// od.OrderH = null;
//}
//db.OrderHs.Remove(oh);
//db.SaveChanges();
//删除主表,并将子表的外键清空 2
//OrderH oh = db.OrderHs.Where(m => m.Id == 2).SingleOrDefault();
//oh.OrderDs.Clear();
//db.OrderHs.Remove(oh);
//db.SaveChanges();
//删除主表,并将子表删除,数据库里设置级联删除
OrderH oh = db.OrderHs.Where(m => m.Id == 1).SingleOrDefault();
db.OrderHs.Remove(oh);
db.SaveChanges();
//只将子表的外键清空 2
//OrderH oh = db.OrderHs.Where(m => m.Id == 1).SingleOrDefault();
//oh.OrderDs.Clear();
//db.SaveChanges();
//只将子表的外键清空
//OrderH oh = db.OrderHs.Where(m => m.Id == 7).SingleOrDefault();
//OrderD od = null;
//foreach (var item in oh.OrderDs)
//{
// od = item;
// od.OrderH = null;
//}
//db.SaveChanges();
//三、多对多的处理
//1,新增
//User u = new User() { Name = "qqh", NewRoles = new List<NewRole>() };
//NewRole nr = new NewRole() { Name = "r1" };
//u.NewRoles.Add(nr);
//db.Users.Add(u);
//db.SaveChanges();
//2,加入一笔新数据
//User u = new User() { Name = "hhyy", NewRoles = new List<NewRole>() };
//NewRole nr = db.NewRoles.Where(m => m.Id == 1).SingleOrDefault();
//u.NewRoles.Add(nr);
//db.Users.Add(u);
//db.SaveChanges();
//3,修改,将一个用户的角色删除
//User u = db.Users.Where(m => m.Id == 1).SingleOrDefault();
//u.Name = "tre";
//u.NewRoles.Clear(); //移除它的所有角色,中间表会清掉相关数据
//db.SaveChanges();
//4,
//throw new Exception("事务测试,抛出异常,事务将回滚");
scope.Complete();
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
objectContext.Connection.Close();
}
}
return View();
}
EF 自测例子的更多相关文章
- 给vs2015添加EF
今天做EF的小例子时,发现需要添加实体数据模型,但是不管怎么找在新建项中都找不到这个选项,这是怎么回事,于是就开始百度吧,有的说可能是VS安装时没有全选,也有的人说可能是重装VS时,没有将注册表清除, ...
- pywinauto简单操作写字板的例子
前段时间写了做web程序界面自动化的简单例子,今天写一下windows gui程序界面自动化测例子吧. ps.咱中国人YinKaisheng封装的UIAutomation库也很好用,https://g ...
- locust接口压测
前言: locust是完全基于python,是一个简单易用的分布式负载测试工具 Locust特性 使用Python编写模拟用户行为的代码,无需繁琐的配置 分布式可扩展,能够支持上百万用户 自带Web界 ...
- Contoso 大学 - 7 – 处理并发
原文 Contoso 大学 - 7 – 处理并发 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's W ...
- XPath、XQuery 以及 XSLT 函数
存取函数 名称 说明 fn:node-name(node) 返回参数节点的节点名称. fn:nilled(node) 返回是否拒绝参数节点的布尔值. fn:data(item.item,...) 接受 ...
- 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能
下期预告: 由于很多园友反馈,有的组件不应该缺席.测试复杂度不够.测试还缺乏一定的公平. 因此考虑在下一个版本中,确保在更加公平的前提下进行更高复杂度的测试 . 同时将分为2组测试,纯SQL组件及纯O ...
- hibernate(三) 一对多映射关系
序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...
- ZIP文件伪加密
题目给出图片,那当然是从图片下手啦! 首先下载图片,在Linux系统下用binwalk工具打开,果然不出所料,里面藏有文件! 用dd把它分解出来! 'txt' 格式的文件提取出来!会看到一个Zip压缩 ...
- 用JUnit4进行单元测试
转载:http://tonl.iteye.com/blog/1948869 参考: http://thihy.iteye.com/blog/1771826 http://developer.51cto ...
随机推荐
- 编写windows版ANE
1.编写WinANE.dll: #include <windows.h> #include <stdlib.h> #include <FlashRuntimeExtens ...
- chrome浏览器遇到的异常
昨天写了一个二进制输出图片的方法,发现在chrome浏览器里面出了异常: (failed) net::ERR_INCOMPLETE_CHUNKED_ENCODING 代码是这样写的: //直接输出 ...
- 特定场景下SQL的优化
1.大表的数据修改最好分批处理. 1000万行的记录表中删除更新100万行记录,一次只删除或更新5000行数据.每批处理完成后,暂停几秒中,进行同步处理. 2.如何修改大表的表结构. 对表的列的字段类 ...
- Octopus系列之数据上传格式要求说明
各个数据列要求 价格列:字符串类型[美元价格] 产品名字:可以支持"/"等字符 分类名字:去空格处理 不得包含"&"符号 主图:一定要有主图列 不为空 ...
- Android中土司(Toast)的使用
Android中Toast的使用 什么是土司(Toast)? Toast是Android系统提供的一种非常好的提示方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失, ...
- myeclipse中文乱码,JSP页面乱码
一.设置新建常见文件的默认编码格式,也就是文件保存的格式.在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致, ...
- 在GitHub上建立个人主页的方法
GitHub就不需要介绍了,不清楚可以百度一下.只说目前GitHub是最火的开源程序托管集中地了,连PHP的源码都在GitHub上面托管了(https://github.com/php ). GitH ...
- Java开发环境的配置
为了能够在计算机上开发Java程序和运行Java程序,就需要在Windows操作系统上配置Java开发环境. 首先,安装JDK: 1.在Oracle官网上下载JavaSE: 2.在Download下载 ...
- CodeBlocks 中fopen函数不支持命令 “r”
//codeblocks #include<stdio.h> #include<stdlib.h> void main(void) { FILE *fp=NULL; if((f ...
- 基于redis的排行榜设计和实现
前言: 最近想实现一个网页闯关游戏的排行榜设计, 相对而言需求比较简单. 秉承前厂长的训导: “做一件事之前, 先看看别人是怎么做的”. 于是乎网上搜索并参考了不少排行榜的实现机制, 很多人都推荐了r ...