EF--增删改查

一、新增

        public void Add1()
        {
            //向表GroupInfo中新增一条数据的写法:
            //1.0 实例化EF上下文容器对象
            PhoneBookEntities db = new PhoneBookEntities();

            //2.0 利用db中的GroupInfo表对应的DbSet<T>泛型类对象 调用Add()方法
            var model = new GroupInfo() { GroupName = "测试1", GroupType = "1" };
            //将model追加到EF容器中,同时生产代理类状态为Added
            db.GroupInfo.Add(model);

            //3.0 通知EF容器发出所有的sql语句给数据库
            db.SaveChanges();
        }
        public void Add2()
        {
            //实例化ef容器对象
            PhoneBookEntities db = new PhoneBookEntities();

            GroupInfo model;

            System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
            st.Start();

            for (int i = 0; i < 1000; i++)
            {
                //1.0 构造要新增数据的实体,此时没有追加到EF容器
                model = new GroupInfo()
                {
                    GroupName = "测试" + i,
                    GroupType = "1"
                };

                //2.0 将model追加到EF容器中,此时代理类的状态为 Added
                db.GroupInfo.Add(model);
            }

            //3.0 将model数据生成insert into语句发送给db执行,注意:将来打开关闭100次ado.net链接
            db.SaveChanges();
        }

二、删除

1.按主键删除

        /// <summary>
        /// 自定义实体结合ef上下文容器中的DbSet对象下的 Attach()+Remove()
        /// </summary>
        public void Del1()
        {
            //1.0 实例化EF上下文容器
            PhoneBookEntities db = new PhoneBookEntities();

            //2.0 构造要删除数据的实体对象
            GroupInfo model = new GroupInfo() { GroupId = 3655 };

            //3.0 将model追加到EF容器,此时产生了代理类状态为 System.Data.EntityState.Detached
            ///System.Data.EntityState.Detached
            db.GroupInfo.Attach(model);

            //3.0 将传入的model的状态修改成Deleted,但是Remove()方法要求modle必须先存在于ef容器中
            db.GroupInfo.Remove(model);

            //扫描当前EF容器中的所有状态!= Detached 的代理类,生成sql语句发给数据库执行
            db.SaveChanges();
        }
        //自定义实体结合 EF上下文中的 Entry() + 手动修改代理类的状态值为Deleted实现删除
        public void Del2()
        {
            //1.0 实例化EF上下文容器
            PhoneBookEntities db = new PhoneBookEntities();

            //2.0 构造要删除数据的实体对象
            GroupInfo model = new GroupInfo() { GroupID = 3568 };

            //3.0 利用db中的Entry()方法将model追加到EF容器中,此时的状态为Detached
            System.Data.Entity.Infrastructure.DbEntityEntry entry = db.Entry(model);
            //4.0 将代理类的状态手动修改成Deleted
            entry.State = EntityState.Deleted;

            //5.0 统一生产sql语句并且发给db执行
            db.SaveChanges();

        }

2.根据条件删除,也是推荐方式

        //EF推荐的删除方式 :先查询 + 再删除 (优点:可以根据任何条件组合进行删除 缺点:先查询操作一次数据库,删除也要操作一次数据库)
        public void Del3()
        {
            PhoneBookEntities db = new PhoneBookEntities();

            //2.0 根据条件查询出数据实体,此实体默认已经存在于EF容器中
            var list = db.GroupInfo.Where(c => c.GroupName == "测试2");
            //var model = db.GroupInfo.FirstOrDefault(c => c.GroupName == "测试1");
            //由于Count():遍历list集合统计出数据条数  Any():检查list集合,只要有一条数据则返回true,否则返回false
            //此代码演示的是批量删除
            if (list != null && list.Any())
            {
                foreach (GroupInfo item in list)
                {
                    //将实体item的状态值修改成 deleted即可
                    db.GroupInfo.Remove(item);
                }
            }

            //4.0 统一生产sql发给数据库执行
            db.SaveChanges();
        }

三、编辑

        //EF推荐的方式:先查 再编辑数据 (缺点:打开关闭了两次ado.net的链接)
        public void Edit1()
        {
            PhoneBookEntities db = new PhoneBookEntities();

            //1.0 查询id为3660的数据实体,此时实体model已经被EF容器管理,此时状态Unchanged
            var model = db.GroupInfo.FirstOrDefault(c => c.GroupId == 3660);

            //2.0 修改 GroupName=‘小蛮腰’,将状态修改成System.Data.EntityState.Modified
            model.GroupName = "小蛮腰1";//此时由于有改动数据,则会自动将GroupName的IsModified变为true,在SaveChanges()的时候,遍历当前实体中的所有属性,如果其IsModified=true则生成到set 后面,否则不生成
            model.GroupType = "1";

            //3.0 发送给db执行,扫描到了有个状态为Modified的代理类,则生成update set GroupName='小蛮腰',GroupType='1' where GroupID=3660
            db.SaveChanges();

        }
        public void Edit2()
        {
            PhoneBookEntities db = new PhoneBookEntities();
            //1.0 new GroupInfo的实体,给GroupName重新赋值
            GroupInfo model = new GroupInfo()
            {
                GroupId = 3660,
                GroupName = "北京天安门1"
            };

            //2.0 将model追加到EF容器中,获取了代理类对象entry,此时代理类的状态为Detaceh
            System.Data.Entity.Infrastructure.DbEntityEntry entry = db.Entry(model);

            //3.0 将状态修改成Modified ,由于Modified 会生成所有的字段的更新,其中
            //有一个GroupType=null但是db表中的约束不为null,所以执行sql语句报错
            //为了解决此问题:1、将代理类的状态修改成 Unchanged 2、将代理类中的需要更新的字段的IsModified修改成true
            entry.State = EntityState.Unchanged;
            entry.Property("GroupName").IsModified = true;

            //4.0 解决对一个或多个实体验证失败 的方法:关闭EF的实体合法性检查
            db.Configuration.ValidateOnSaveEnabled = false;

            //4.0 抛出异常:对一个或多个实体验证失败 
            db.SaveChanges();
        }

四、链表查询

        //连表查询的方式1 ,生成 INNER JOIN
        public void Join1()
        {
            PhoneBookEntities db = new PhoneBookEntities();
            var sql = db.ContactInfo.Join(db.GroupInfo, c => c.GroupId, g => g.GroupId, (c, p) => new { c.ContactName, p.GroupName });

            var list = sql.ToList();

            list.ForEach(c => Console.WriteLine(c.GroupName + "  " + c.ContactName));

        }
        //连表查询方式2 Include() 产生sql语句是 LEFT OUTER JOIN <-> Left Join
        public void Join2()
        {
            PhoneBookEntities db = new PhoneBookEntities();

            db.ContactInfo.Include("GroupInfo").Where(c => c.ID < 3).ToList().ForEach(c => Console.WriteLine(c.ContactName + "  分组=" + c.GroupInfo.GroupName));
        }

五、分页

        public void Page()
        {
            PhoneBookEntities db = new PhoneBookEntities();
            int pageindex = 2;
            int pagesize = 2;
            int skipcount = (pageindex - 1) * pagesize;
            //注意点:在EF中使用Skip()方法之前必须先进行排序操作
            db.ContactInfo.OrderBy(c => c.ID).Skip(skipcount).Take(pagesize).ToList().ForEach(c => Console.WriteLine(c.ID));
        }

六、调用存储过程

         public void CallPro()
        {
            PhoneBookEntities db = new PhoneBookEntities();

            //调用存储过程Usp_GetAllContact9
            int pageindex = 1;
            int pagesieze = 2;
            int count = 0;
            //由于totalCount是一个输出参数,所以由程序员自己定义
            System.Data.Objects.ObjectParameter ps = new System.Data.Objects.ObjectParameter("totalCount", count);

            var list = db.Usp_GetAllContact9(pageindex, pagesieze, ps);

            list.ToList().ForEach(c => Console.WriteLine(c.ID));

            Console.WriteLine("总行数=" + ps.Value);
        }

七、EF执行sql

        public void EFSql()
        {
            PhoneBookEntities db = new PhoneBookEntities();

            string upsql = "update GroupInfo set GroupName='小蛮腰' where GroupId = @id";

            //利用EF执行sql语句
            System.Data.SqlClient.SqlParameter[] p = new System.Data.SqlClient.SqlParameter[] {
            new  System.Data.SqlClient.SqlParameter("@id",209)
            };
            db.Database.ExecuteSqlCommand(upsql, p);


        }

八、EF上下文容器中的Set泛型方法的作用

        public void Set()
        {
            PhoneBookEntities db = new PhoneBookEntities();

            //db.GroupInfo.FirstOrDefault(c => c.GroupId == 209);
            //当db中没有GroupInfo的DbSet<GroupInfo>对象的时候,就无法操作数据表GroupInfo
            //解决方案:可以使用db.Set<GroupInfo> 动态实例化DbSet<GroupInfo>对象//等价于 db.GroupInfo
            var model = db.Set<GroupInfo>().FirstOrDefault(c => c.GroupId == 209);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值