小分享:我有幾張阿裡雲優惠券,用券購買或者升級阿裡雲相應產品最多可以優惠五折!領券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在做增刪改查先,先介紹幾個知識點: 1.代理 ...
小分享:我有幾張阿裡雲優惠券,用券購買或者升級阿裡雲相應產品最多可以優惠五折!領券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03
在做增刪改查先,先介紹幾個知識點:
1.代理類
在將對象方法EF數據上下文時,EF會為該對象封裝 一個代理類對象,
同時為該對象的每一個屬性添加一個標誌:unchanged,
當對該對象某個屬性進行操作時,該屬性就被標誌位Modified,同時也將改對象標誌給位Modified,
當調用SaveChanges()方法時,根據標誌屬性,生成相應的sql語句。
2.Attach()添加到代理類中(不推薦使用)
Attach()方法時將一個對象附加到EF上下文中,而Attach()返回的是一個實體類,並不是代理類。
一、幾個方法的說明
1.一個是Entry()方法:
public DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class;
可以將 對象保存到 EF數據上下文中
DbEntityEntry有個 屬性EntityState,它可以為上下文中的代理對象做標識,並依照標識的值做相應的sql操作
public enum EntityState
{
Detached = 1,
Unchanged = 2,
Added = 4,
Deleted = 8,
Modified = 16,
}
2.還有一個Set()方法
public DbSet<TEntity> Set<TEntity>() where TEntity : class;
//通過public DbSet<TEntity> Set<TEntity>() where TEntity : class;和 |
3.操作中幾個方法的說明:
SaveChange():EF在SaveChanges的時候,會遍歷上下文內容器里的所有實體對象,並檢查對象的State 屬性,生成相應的SQL語句,在一次性發到資料庫中執行 |
幾個知識點:
1.上下文中,主鍵相同的實體只能被添加一次,否則會拋異常。 因為上下文內部預設實現了,對其中的對象進行了追蹤。當A取出數據準備修改Data時;這個時候B可以取出數據Data,但不能修改,因為當前追蹤器在A那邊,直等到A釋放了資源,B才可進行相應的操作。可以通過設置 Entry(t).State=EntityState.Detatched;不進行追蹤 2. |
二、增刪改查
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(); }
參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html