好久沒有學習新東西了,最近研究了下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
二查詢(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
關聯查詢(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
三修改(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
修改(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
四刪除:
#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
五 批處理(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
批處理(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
附:底層封裝
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 }
