好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C# EF增删改查

  • 1.增

    //1.创建一个EF数据上下文对象MyDBEntities context=new MyDBEntities();//2.将要添加的数据,封装成对象
     Users user = new Users() {Age = 22, Name = "Kim1"};//3.将改对象放入EF容器中,默认会为该对象加一个封装类对象(代理类对象)//用户对对象的操作,实际上是对代理类的操作 //DbEntityEntry保存着实体状态,当对象被加入时,EF默认为该对象设置State的属性为unchanged
     DbEntityEntry<Users> entityEntry = context.Entry<Users>(user); //4.设置对象的标志位Added
     entityEntry.State=EntityState.Added;  //5.当调用SaveChanges()时,EF会遍历所有的代理类对象,并根据标志生成相应的sql语句  context.SaveChanges();
     Console.WriteLine("添加成功");

    2.删

    2.1根据Id(表的主键)删除

    MyDBEntities context=new MyDBEntities();
     Users user = new Users() {Id = 8};//将要删除的对象附加到EF容器中 context.Users.Attach(user);  //Remove()起到了标记当前对象为删除状态,可以删除 context.Users.Remove(user);
      context.SaveChanges();
     Console.WriteLine("删除成功");

    2.2根据非主键删除

    //1.要删除的条件,这里是要删除name为Kim的项
     string name = "Kim";//2.获得name为Kim的对象
     var s1 = from s in context.Users          where s.Name==name          select s;//3.如果有多个的话就用foreach()遍历,这里就删除第一个context.Users.Remove(s1.FirstOrDefault());//4.保存到数据库context.SaveChanges();

    3.改

    //1.获得要更新后的数据,在mvc中的Action方法,可直接获得 更新后的对象Users u = new Users() { Id = 4, Name = "kim" };//2.标识为修改context.Entry<Users>(u).State = EntityState.Modified;//3.保存到数据库context.SaveChanges();

    3.1批量修改

    /// <summary>/// 批量编辑 数据/// </summary>/// <param name="model">要编辑成 的数据</param>/// <param name="whereLambda">where条件,输入lambda表示式</param>/// <param name="modefiedProNames">要修改的 属性名</param>/// <returns>修改的条数</returns>public int ModefyBy(Model.Users model, Expression<Func<Model.Users, bool>> whereLambda, params string[] modefiedProNames)
    {     //1.查询要修改的数据
           List<Model.Users> listModefing = context.Users.Where(whereLambda).ToList();      //获取 实体类 类型对象
            Type t = typeof(Model.Users);       //获取 实体类 所有的 公共属性
            List<PropertyInfo> proInfos = t.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();       //创建 实体属性 字典集合
            Dictionary<string, PropertyInfo> dictPros = new Dictionary<string, PropertyInfo>();       //将 实体属性 中要修改的属性名 添加到 字典集合中 键:属性名  值:属性对象
            proInfos.ForEach(p =>
           {           if (modefiedProNames.Contains(p.Name))
               {
                    dictPros.Add(p.Name, p);
                }
            });        //循环 要修改的属性名
              foreach (string proName in modefiedProNames)
             {            //判断 要修改的属性名是否在 实体类的属性集合中存在
                  if (dictPros.ContainsKey(proName))
                 {                 //如果存在,则取出要修改的 属性对象
                         PropertyInfo proInfo = dictPros[proName];                   //取出 要修改的值
                          object newValue = proInfo.GetValue(model);                   //批量设置 要修改 对象的 属性
                           foreach (Users user in listModefing)
                        {                        //为 要修改的对象 的 要修改的属性 设置新的值                            proInfo.SetValue(user, newValue);
                         }
                     }
                 }           //一次性 生成sql语句到数据库执行
                 return context.SaveChanges();
    }

    4.查

    4.1普通查

    //查询Name为Kim的全部数据var s = context.Users.Where(u => u.Name == "Kim").Select(u => u);

     4.2分页查

    注意:分页查询的时候,一定要先排序,因为其内部是做了一个row_number()的操作。 
    Func<T,bool>是Expression<Func<T,bool>>的缩小,Expression可以理解为就是Lambda的容器

    /// <summary>/// 分页查询 /// </summary>/// <typeparam name="T">要操作的数据类型</typeparam>/// <param name="whereLambda">Where条件语句</param>/// <param name="orderLambda">按什么条件排序</param>
     /// <param name="pageSize">每页都少条数据</param>/// <param name="pageIndex">要查询第几页</param>
      /// <returns>返回一个泛型集合</returns>
     static List<T> GetPageList<T>(Func<T, bool> whereLambda, Func<T, object> orderLambda, int pageSize,  int pageIndex) where T : class
       {
             MyDBEntities context = new MyDBEntities();  
             var list =  context.Set<T>().Where(whereLambda).OrderBy(orderLambda).Skip((pageIndex - 1) * pageSize).Take(pageSize);         return list.ToList();
     }



查看更多关于C# EF增删改查的详细内容...

  阅读:102次