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 自测例子的更多相关文章

  1. 给vs2015添加EF

    今天做EF的小例子时,发现需要添加实体数据模型,但是不管怎么找在新建项中都找不到这个选项,这是怎么回事,于是就开始百度吧,有的说可能是VS安装时没有全选,也有的人说可能是重装VS时,没有将注册表清除, ...

  2. pywinauto简单操作写字板的例子

    前段时间写了做web程序界面自动化的简单例子,今天写一下windows gui程序界面自动化测例子吧. ps.咱中国人YinKaisheng封装的UIAutomation库也很好用,https://g ...

  3. locust接口压测

    前言: locust是完全基于python,是一个简单易用的分布式负载测试工具 Locust特性 使用Python编写模拟用户行为的代码,无需繁琐的配置 分布式可扩展,能够支持上百万用户 自带Web界 ...

  4. Contoso 大学 - 7 – 处理并发

    原文 Contoso 大学 - 7 – 处理并发 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Microsoft's W ...

  5. XPath、XQuery 以及 XSLT 函数

    存取函数 名称 说明 fn:node-name(node) 返回参数节点的节点名称. fn:nilled(node) 返回是否拒绝参数节点的布尔值. fn:data(item.item,...) 接受 ...

  6. 测试 ClownFish、CYQ、Entity Framework、Moon、MySoft、NHibernate、PDF、XCode数据访问组件性能

    下期预告: 由于很多园友反馈,有的组件不应该缺席.测试复杂度不够.测试还缺乏一定的公平. 因此考虑在下一个版本中,确保在更加公平的前提下进行更高复杂度的测试 . 同时将分为2组测试,纯SQL组件及纯O ...

  7. hibernate(三) 一对多映射关系

    序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...

  8. ZIP文件伪加密

    题目给出图片,那当然是从图片下手啦! 首先下载图片,在Linux系统下用binwalk工具打开,果然不出所料,里面藏有文件! 用dd把它分解出来! 'txt' 格式的文件提取出来!会看到一个Zip压缩 ...

  9. 用JUnit4进行单元测试

    转载:http://tonl.iteye.com/blog/1948869 参考: http://thihy.iteye.com/blog/1771826 http://developer.51cto ...

随机推荐

  1. 字符串与模式匹配(一)——KMP算法

    源码:kmp.cpp // KMP.cpp : Defines the entry point for the console application. // #include "stdaf ...

  2. Foundation框架—集合

    Foundation框架—集合 一.NSArray和NSMutableArray (一)NSArray不可变数组 (1)NSArray的基本介绍 NSArray是OC中使用的数组,是面向对象的,以面向 ...

  3. C# 反射/映射学习

    反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某个成员(通过反射可以访问该类所包含的所有成员,不论成员是公有还是私有) 1 ...

  4. WinRT知识积累1之读xml数据

    前述:这个知识是在Windows8.1或WP8.1中运用Linq to xml获取一个xml文件里的数据.(网上也很多类似的知识,可以借鉴参考) 平台:windows8.1 metro 或者WP8.1 ...

  5. Android 绿豆蛙版连连看(简陋版)

    (里面有六张绿豆蛙的图片) 1.选中会有红色框 2.可以直线连(横竖相邻或是横竖间隔空格) 3.可以拐一次弯连接 4.可以拐两次弯连接 5.连接时会有线显示 6.绿色代表进度条,蓝色代表时间条 imp ...

  6. python分割字符串split,filter函数用法

    现有字符串,需要取出用空格分隔的第一段,操作如下 >>> product_model = ‘WS-C2960G-24TC-L – Fixed Module 0′>>> ...

  7. Python使用CGIHTTPServer调用shell作为cgi脚本

    #!/bin/bash echo "Content-Type:text/html" echo "" echo "hello world!" ...

  8. DIY FSK RFID Reader

    This page describes the construction of an RFID reader using only an Arduino (Nano 3.0 was tested, b ...

  9. CSS特性: 继承 和 层叠

    在css中也存在着继承关系,与面向对象的编程语言不同,css的继承很简单,而且主要指的是在CSS盒模型中,外围的盒子的样式会被内部所包含的盒子所继承.具体来了解一下. HTML元素之间存在一个”树型“ ...

  10. Oracle 查看表空间的大小及使用情况sql语句

    --1.查看表空间的名称及大小 )), ) ts_size FROM dba_tablespaces t, dba_data_files d WHERE t.tablespace_name = d.t ...