EntityFramework基礎


 好久沒有學習新東西了,最近研究了下EntityFramework,將基礎代碼貼出來,

Entity Framework 利用了抽象化 數據結構的方式,將每個 數據庫對象都轉換成 應用程序對象 (entity),而數據字段都轉換為屬性 (property),關系則轉換為結合屬性 (association),讓數據庫的 E/R 模型完全的轉成對象模型,如此讓 程序設計師能用最熟悉的編程語言來調用訪問。而在抽象化的結構之下,則是高度集成與對應結構的概念層、對應層和儲存層,以 及支持 Entity Framework 的數據提供者 (provider),讓數據訪問的工作得以順利與完整的進行。
(1) 概念層:負責向上的對象與屬性顯露與訪問。
(2) 對應層:將上方的概念層和底下的儲存層的 數據結構對應在一起。
(3) 儲存層:依不同數據庫與 數據結構,而顯露出實體的數據結構體,和 Provider 一起,負責實際對數據庫的訪問和 SQL 的產生。
預備知識:Linq、C#匿名類和拉姆達表達式、
廢話不多說,直接上代碼
一添加:首先創建試題對象,將要添加的數據復制到對象屬性上,然后添加到數據庫
   #region 添加
        static AdvEFEntities db = new AdvEFEntities();
        static void Add()
        {
            Guid id = new Guid("00000000-0000-0000-0000-000000000000");
            //創建實體對象
            AdvertisingArea advEF = new AdvertisingArea()
            {
                QuName = "1111",
                ShengId = 2,
                ShiId = 2,
                ShengName = "22222",
                ShiName = "23333",
                QuId = 2232,
            };
            //將對象添加到數據庫中
            //將對象上下文存到AdvertisingArea集合中
            // db.Advertising.Add(advEF);
            DbEntityEntry<AdvertisingArea> entry = db.Entry<AdvertisingArea>(advEF);
            //設置數據狀態
            entry.State = System.Data.EntityState.Added;
            db.SaveChanges();
            Console.WriteLine("數據添加完成");
        }
        #endregion
View Code

     二查詢(1)單表查詢:

        查詢出QuName字段包含”我是新增“的數據

        #region 查詢
        static void Query()
        {
            //變相的即時查詢 
            List<AdvertisingArea> area = db.AdvertisingArea.Where(u => u.QuName.Contains("我是新增")).ToList();
            area.ForEach(u => Console.WriteLine(u.ToString()));
        }
        #endregion
View Code

    關聯查詢(2):關聯查詢要求數據庫結構必須存在主外鍵關系,當生成試題類的時候EF會根據數據庫結構生成出每張表的試題類,並且包含當前表的外鍵的映射關系

  連接查詢查詢出CommonUser表和CommonUnit表 關聯條件unitId=unitId

     #region 2.2 連接查詢(生成 inner join) -void QueryInnerJoin()
        /// <summary>
        /// 2.2 連接查詢(生成 inner join)
        /// </summary>
        static void QueryInnerJoin()
        {
            //通過Include方法,設置 EF 生成 sql 語句時,使用 inner join 把 地址表對應的 User屬性 也查出來
            //   select * from CommonUser a inner join CommonUnit u on a.udId =u.id 
            Guid id = new Guid("00000000-0000-0000-0000-000000000000");
            IQueryable<CommonUser> addrs = db.CommonUser.Include("CommonUnit").Where(a => a.unitId == id);
            foreach (CommonUser add in addrs)
            {
                Console.WriteLine(add.loginName + ":userName=" + add.CommonUnit.unitName);
            }

        }
        #endregion
View Code

   三修改(1)官方推薦方法:首先查詢出要修改的數據, 然后將修改后的數據重新復制個對象屬性,然后保存到數據庫

   #region 修改
        /// <summary>
        /// 
        /// </summary>
        static void Update()
        {
            //查詢出一個 要修改的對象 -- 注意:此時返回的 是 一個 AdvertisingArea類的 代理類對象(包裝類對象)
            AdvertisingArea area = db.AdvertisingArea.Where(u => u.Id == 24).FirstOrDefault();
            Console.WriteLine("修改前" + area.ToString());
            //2.修改內容 -- 注意:此時其實操作的 是 代理類對象 的屬性,這些屬性,會將 值 設置給 內部的 AdvertisingArea對象對應的屬性,同時 標記此屬性為已修改狀態
            area.QuName = "1111111111111111111111111";
            //.重新保存到數據庫 -- 注意:此時 ef上下文,會檢查容器內部 所有的對象,找到 標記為修改的 對象,然后 找到 標記為修改的 對象屬性,生成對應的 update語句 執行!
            db.SaveChanges();
            Console.WriteLine("修改后" + area.ToString());
        }
        #endregion
View Code

      修改(2)直接修改方法:
  

   #region 直接修改
        /// <summary>
        /// 
        /// </summary>
        static void UpdateZhiJie()
        {
            //1.查詢出一個 要修改的對象
            AdvertisingArea usr = new AdvertisingArea() { Id = 23, ShiName = "asdasdasdasdas" };
            //2.將 對象 加入 EF容器,並獲取 當前實體對象 的 狀態管理對象
            DbEntityEntry<AdvertisingArea> entry = db.Entry<AdvertisingArea>(usr);
            //3.設置 該對象 為被修改過
            entry.State = System.Data.EntityState.Unchanged;
            //4.設置 該對象 的 uName屬性 為 修改狀態,同時 entry.State 被修改為 Modified 狀態
            entry.Property("ShiName").IsModified = true;

            //3.重新保存到數據庫 -- ef 上下文 會 根據 實體對象的 狀態 ,根據 entry.State =Modified 的值 生成 對應的 update sql 語句
            db.SaveChanges();
            Console.WriteLine("修改成功:");
            Console.WriteLine(usr.ToString());
        }
        #endregion
View Code

  四刪除:

    #region 刪除
        /// <summary>
        /// 
        /// </summary>
        static void Delete()
        {
            AdvertisingArea adv = new AdvertisingArea() { Id = 22 };
            db.AdvertisingArea.Attach(adv);
            db.AdvertisingArea.Remove(adv);
            db.SaveChanges();
            Console.WriteLine("刪除成功");
        }
        #endregion
View Code

五 批處理(1):可以將所有的操作(增加、修改、刪除)添加到集合中,只需SaveChange()一次,即可秩序全部操作

     #region  批處理 -- 上下文 SaveChanges 方法 的 好處!!!!
        /// <summary>
        /// 批處理 -- 上下文 SaveChanges 方法 的 好處!!!!
        /// </summary>
        static void SaveBatched()
        {


            //新增數據
            //創建實體對象
            AdvertisingArea advEF1 = new AdvertisingArea()
            {
                QuName = "我是新增1",
                ShengId = 2,
                ShiId = 2,
                ShengName = "22222",
                ShiName = "23333",
                QuId = 2232,
            }; ;
            db.AdvertisingArea.Add(advEF1);
            //創建實體對象
            AdvertisingArea advEF2 = new AdvertisingArea()
            {
                QuName = "我是新增2",
                ShengId = 2,
                ShiId = 2,
                ShengName = "22222",
                ShiName = "23333",
                QuId = 2232,
            }; ;
            db.AdvertisingArea.Add(advEF2);

            //修改數據
            AdvertisingArea usr = new AdvertisingArea() { Id = 24, QuName = "又黑了~~~" };
            DbEntityEntry<AdvertisingArea> entry = db.Entry<AdvertisingArea>(usr);
            entry.State = System.Data.EntityState.Unchanged;
            entry.Property("QuName").IsModified = true;

            //刪除數據
            AdvertisingArea u = new AdvertisingArea() { Id = 22 };
            //附加到 EF中
            db.AdvertisingArea.Attach(u);
            //標記為刪除 注意:此方法 就是 起到了 標記 當前對象  為 刪除狀態 !
            db.AdvertisingArea.Remove(u);

            db.SaveChanges();
            Console.WriteLine("批處理 完成~~~~~~~~~~~~!");
        }
        #endregion
View Code

  批處理(2)循環添加:

  #region  批處理 -- 一次新增 50條數據 -void BatcheAdd()
        /// <summary>
        /// 批處理 -- 一次新增 50條數據
        /// </summary>
        static void BatcheAdd()
        {
            for (int i = 0; i < 50; i++)
            {
                AdvertisingArea uObj = new AdvertisingArea()
                {
                    QuName = "我是新增" + i,
                    ShengId = 2,
                    ShiId = 2,
                    ShengName = "22222",
                    ShiName = "23333",
                    QuId = 2232,
                };
                db.AdvertisingArea.Add(uObj);
            }
            db.SaveChanges();
        }
        #endregion
View Code

附:底層封裝

public class CommonUser
    {
        EFModel.AdvEFEntities db = new EFModel.AdvEFEntities();
        #region 新增實體

        public int Add(EFModel.CommonUser area)
        {
            db.CommonUser.Add(area);
            return db.SaveChanges();
        }
        #endregion


        #region  根據 用戶 id 刪除 +int Del(int uId)
        /// <summary>
        /// 根據 用戶 id 刪除
        /// </summary>
        /// <param name="uId"></param>
        /// <returns></returns>
        public int Del(Guid userId)
        {
            EFModel.CommonUser usr = new EFModel.CommonUser() { userId  = userId };
            db.CommonUser.Attach(usr);
            db.CommonUser.Remove(usr);
            return db.SaveChanges();
        }
        #endregion

        #region  根據條件刪除 +int DelBy(Expression<Func<P05MODEL.User, bool>> delWhere)
        /// <summary>
        /// 根據條件刪除
        /// </summary>
        /// <param name="delWhere"></param>
        /// <returns></returns>
        public int DelBy(Expression<Func<EFModel.CommonUser, bool>> delWhere)
        {
            List<EFModel.CommonUser> listDeleting = db.CommonUser.Where(delWhere).ToList();
            listDeleting.ForEach(u => db.CommonUser.Remove(u));
            return db.SaveChanges();
        }
        #endregion

        #region 修改 +int Modify(EFModel.CommonUser model, params string[] proNames)
        /// <summary>
        ///  修改,如:
        ///EFModel.CommonUser u = newEFModel.CommonUser() { uId = 1, uLoginName = "asdfasdf" };
        /// this.Modify(u, "uLoginName");
        /// </summary>
        /// <param name="model">要修改的實體對象</param>
        /// <param name="proNames">要修改的 屬性 名稱</param>
        /// <returns></returns>
        public int Modify(EFModel.CommonUser model, params string[] proNames)
        {
            DbEntityEntry entry = db.Entry<EFModel.CommonUser>(model);
            entry.State = System.Data.EntityState.Unchanged;
            foreach (string proName in proNames)
            {
                entry.Property(proName).IsModified = true;
            }
            return db.SaveChanges();
        }
        #endregion

        #region  根據條件查詢 +List<EFModel.CommonUser> GetListBy(Expression<Func<EFModel.CommonUser,bool>> whereLambda)
        /// <summary>
        ///  根據條件查詢 +List<EFModel.CommonUser> GetListBy(Expression<Func<EFModel.CommonUser,bool>> whereLambda)
        /// </summary>
        /// <param name="whereLambda"></param>
        /// <returns></returns>
        public List<EFModel.CommonUser> GetListBy(Expression<Func<EFModel.CommonUser, bool>> whereLambda)
        {
            return db.CommonUser.Where(whereLambda).ToList();
        }
        #endregion

        #region  根據條件 排序 和查詢 + List<EFModel.CommonUser> GetListBy<TKey>
        /// <summary>
        ///  根據條件 排序 和查詢
        /// </summary>
        /// <typeparam name="TKey">排序字段類型</typeparam>
        /// <param name="whereLambda">查詢條件 lambda表達式</param>
        /// <param name="orderLambda">排序條件 lambda表達式</param>
        /// <returns></returns>
        public List<EFModel.CommonUser> GetListBy<TKey>(Expression<Func<EFModel.CommonUser, bool>> whereLambda, Expression<Func<EFModel.CommonUser, TKey>> orderLambda, bool desc)
        {
            if (desc)
            {
                return db.CommonUser.Where(whereLambda).OrderByDescending(orderLambda).ToList();
            }
            else
            {
                return db.CommonUser.Where(whereLambda).OrderBy(orderLambda).ToList();
            }
        }
        #endregion

        #region 分頁查詢 + List<EFModel.CommonUser> GetPagedList<TKey>
        /// <summary>
        ///  分頁查詢 + List<EFModel.CommonUser> GetPagedList<TKey>
        /// </summary>
        /// <param name="pageIndex">頁碼</param>
        /// <param name="pageSize">頁容量</param>
        /// <param name="whereLambda">條件 lambda表達式</param>
        /// <param name="orderBy">排序 lambda表達式</param>
        /// <returns></returns>
        public List<EFModel.CommonUser> GetPagedList<TKey>(int pageIndex, int pageSize, Expression<Func<EFModel.CommonUser, bool>> whereLambda, Expression<Func<EFModel.CommonUser, TKey>> orderBy, bool desc)
        {
            if (desc)
            {
                return db.CommonUser.Where(whereLambda).OrderByDescending(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
            }
            else
            {
                return db.CommonUser.Where(whereLambda).OrderBy(orderBy).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
            }

        }
        #endregion
    }
View Code

 


免責聲明!

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



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