C#基础 EF之增删改查

//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("添加成功");

根据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("删除成功");`

根据非主键删除

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

单改

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

注意:
在EF框架里,PK(主键)是不能被修改的,不管是用这种方法还是用老式的获取数据再修改都会报错哦
以上方法报的错一般是:
存储更新,插入或删除语句影响了意外的行数(0)
(当然,如果更新的时候没有PK依然会报这种错)

而如果是老式方法,一般会直接提示“XXX是对象的键信息的一部分,不能修改”

批量改

/// <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();
}

普通查

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

分页查
注意:
分页查询的时候,一定要先排序,因为其内部是做了一个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();
 }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值