• 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();

              
            }

  • 相关阅读:
    zabbix邮件报警设置(加密)
    Linux实战(10):ssh密码被拒绝
    Linux实战(9):Docker一键搭建kms服务
    Linux实战(8):查看文件大小
    Linux实战(7):centos7安装xrdp
    Linux实战(6):Centos8上传镜像
    Linux实战(5):Centos8安装python
    Linux实战(4):Centos7升级python
    nginx实战(1):宝塔设置反向代理
    Dell服务器R710修改iDRAC密码
  • 原文地址:https://www.cnblogs.com/movemoon/p/EF.html
Copyright © 2020-2023  润新知