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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM