增成功后EF容器里面的實體不會被銷毀,EF查詢出來的都是代理類對象或集合
//1.0 創建實體 BlogUser usrModel = new BlogUser() { LoginName = "xiaobai1", LoginPwd = "4297F44B13955235245B2497399D7A93", CnName = "小白", Email = "xiaobai@oumind.com", IsDel = false, IsLock = 0, AddTime = DateTime.Now, LastLoginIP = "127.0.0.1", LastLoginTime = DateTime.Now }; //2.0 調用EF容器,向指定的 屬性中(表) 添加實體對象 db.BlogUsers.Add(usrModel); //3.0 調用EF容器的 SaveChanges方法,將容器里的對象 保存到數據庫,並返回受影響行數! int resCount = db.SaveChanges(); //4.0 新增后,主鍵屬性Id,會被賦值(新增后的id) MessageBox.Show(usrModel.Id.ToString());
1 批量添加 2 //1.0 創建實體1 3 BlogUser usrModel = new BlogUser() 4 { 5 LoginName = "xiaobai2", 6 LoginPwd = "4297F44B13955235245B2497399D7A93", 7 CnName = "小白2", 8 Email = "xiaobai2@oumind.com", 9 IsDel = false, 10 IsLock = 0, 11 AddTime = DateTime.Now, 12 LastLoginIP = "127.0.0.1", 13 LastLoginTime = DateTime.Now 14 }; 15 16 //1.0 創建實體2 17 BlogUser usrModel2 = new BlogUser() 18 { 19 LoginName = "xiaobai3", 20 LoginPwd = "4297F44B13955235245B2497399D7A93", 21 CnName = "小白3", 22 Email = "xiaobai3@oumind.com", 23 IsDel = false, 24 IsLock = 0, 25 AddTime = DateTime.Now, 26 LastLoginIP = "127.0.0.1", 27 LastLoginTime = DateTime.Now 28 }; 29 30 db.BlogUsers.Add(usrModel); 31 db.BlogUsers.Add(usrModel2); 32 int resCount = db.SaveChanges(); 33 MessageBox.Show("受影響行數:" + resCount);

1 #region 5.0 Ef 刪除 的3中方式 2 private void btnDel_Click(object sender, EventArgs e) 3 { 4 //1.0 EF 推薦刪除方式 - 先查,再刪 5 ////1.1 先根據id查詢 出 要刪除的 對象(存入EF容器) 6 //BlogUser usr = db.BlogUsers.Where(u => u.Id == 45).FirstOrDefault(); 7 ////1.2 將實體對象刪除(就是將 容器中的 代理對象的 State改成 Deleted) 8 //db.BlogUsers.Remove(usr); 9 ////1.3 將EF容器里所有的對象 根據 State 屬性值,生成不同sql語句,更新到數據庫 10 //db.SaveChanges(); 11 12 //2.0 使用 Attach + Remove Id = 2051 13 //BlogUser usr = new BlogUser() { Id = 2051 };//會根據指定主鍵刪除(也只能根據指定id刪除) 14 ////2.1 將對象 附加到 EF容器中 15 //db.BlogUsers.Attach(usr);//State=Unchanged 16 //db.BlogUsers.Remove(usr);//State=Deleted 17 //db.SaveChanges(); 18 19 //3.0 手動 設置刪除 20 BlogUser usr = new BlogUser() { Id = 2052 }; 21 //3.1將對象加入 EF容器,並返回 代理對象里的跟蹤器 22 DbEntityEntry entry = db.Entry(usr);//State=unchanged 23 //3.2將代理對象的狀態 改成 刪除狀態 24 entry.State = EntityState.Deleted; 25 //3.3保存 26 db.SaveChanges(); 27 } 28 #endregion

1 //1.0 先按照條件查詢 2 var list = db.BlogUsers.Where(u => u.IsDel == true).ToList(); 3 //2.0 遍歷集合,將 要刪除的 對象 的代理對象的State 設置為 Deleted 4 list.ForEach(u => db.BlogUsers.Remove(u)); 5 //3.0 執行更新 6 int resCount = db.SaveChanges(); 7 //4.0 獲取受影響行數 8 MessageBox.Show("刪除行數:" + resCount);

1 //1.EF推薦 - 先查,再改 2 //BlogArticle article = db.BlogArticles.Where(a => a.AId == 2).FirstOrDefault(); 3 //article.ATitle = "我愛廣州小蠻腰2"; 4 //article.APlnum = 11; 5 //db.SaveChanges(); 6 7 //2.手動修改 8 //關閉EF的 為空 檢查驗證 9 db.Configuration.ValidateOnSaveEnabled = false; 10 //2.1 創建實體 11 BlogUser usrModel = new BlogUser() 12 { 13 Id = 28, 14 LoginName = "xiaobai1", 15 CnName = "小白" 16 }; 17 //2.2 加入到EF容器 18 DbEntityEntry entry = db.Entry(usrModel);//State=Detached ,EF容器部管理此狀態的代理對象 19 //2.3 將代理對象狀態 改為 Unchanged 以便接受 EF容器管理 20 entry.State = EntityState.Unchanged; 21 //2.4 指定 被修改的屬性 對應的 IsModified 值,EF 會根據IsModified值判斷是否要生成修改 的sql語句 22 entry.Property("LoginName").IsModified = true; 23 entry.Property("CnName").IsModified = true; 24 //2.5更新到數據庫 25 db.SaveChanges(); 26 // 27 //db.Configuration.ValidateOnSaveEnabled = true;
引用類型不給值就為null

1 List<BlogUser> listUsers = new List<BlogUser>(); 2 //集合的 SQO 方法 定義在 System.Linq.Enumerable 類中,擴展到 IEnumerable<T>接口上 3 var listU = listUsers.Where(u => u.Id == 2); 4 5 //--------------------IQueryable 的SQO方法 最終目的是生成 SQL語句,其次才是執行sql語句,獲取對象集合--------------- 6 ////EF 上下文里的 屬性 都是 DBSet<T>類型,繼承關系:DBSet<T> : DBQuery<T> : IQueryable<T> 7 //var listCates = db.BlogArticleCates; 8 ////EF的 SQO 方法 定義在 System.Linq.Queryable類中,擴展到 IQueryable<T>接口上 9 ////返回的是 實現了 IQueryable接口的 DBQuery類 的對象 10 //var listCates2 = db.BlogArticleCates.Where(c => c.IsDel == false); 11 12 ////排序的SQO方法,返回 IOrderedQueryable 接口:IQueryable接口,所以,也可以繼續“鏈式編程” 13 //var listCates3 = db.BlogArticleCates.Where(c => c.IsDel == false).OrderBy(c => c.Id).ThenBy(c => c.Name.Length); 14 15 //1.0 EF默認 使用 延遲加載(按需加載) - 由DBQuery對象負責執行 16 //var listCate = db.BlogArticleCates.Where(c => c.IsDel == false).OrderBy(c => c.Id).ThenBy(c => c.Name.Length); 17 ////DBQuery只有被第一次訪問的時候,才去 數據庫查詢數據,並 顯示 18 //foreach (var cate in listCate) 19 //{ 20 // Console.WriteLine(cate.Id + "," + cate.Name); 21 //} 22 23 /*強調:凡是通過 EF 查詢出來的 都是 代理類 對象 或 集合*/ 24 //2.0 EF 可以直接訪問 外鍵屬性(實體類的外鍵屬性都是 virtual 屬性,被代理對象重寫,所以可以查詢數據庫) 25 var listCate = db.BlogArticleCates.Where(c => c.IsDel == false).OrderBy(c => c.Id).ThenBy(c => c.Name.Length); 26 // 當 訪問 實體對象的 外鍵屬性(BlogUser) 的時候,EF會自動根據 外鍵id(Author),查詢 主鍵表(BlogUsers表) 27 // EF針對外鍵查詢時,有優化:相同外鍵值 只查詢一次!(比如 2個文章分類的作者都是 xiaobai,那么只需要查詢一次 xiaobai) 28 foreach (var cate in listCate) 29 { 30 Console.WriteLine(cate.Id + "," + cate.Name + ",作者:" + cate.BlogUser.CnName); 31 }

1 //1.0 通過 Include 方法 生成 連接查詢語句 (注意:Include只能跟在 DBSet屬性后使用,然后再 調用SQO方法) 2 //var list = db.BlogArticleCates.Include("BlogUser").Include("BlogArticles").Where(c => c.IsDel == false); 3 //foreach (var item in list) 4 //{ 5 // Console.WriteLine(item.Id + "," + item.Name + ",作者:" + item.BlogUser.CnName+",文章數量:"+item.BlogArticles.Count); 6 //} 7 8 //2.0 通過 Select 方法 自動生成 連接查詢語句,條件:在Select中使用到 外鍵屬性(如:當前代碼的 c.BlogUser.CnName),EF就會生成連接查詢語句 9 var list2 = db.BlogArticleCates.Where(c => c.IsDel == false).Select(c => new { ID = c.Id, Name = c.Name, AuthorName = c.BlogUser.CnName }).ToList(); 10 list2.ForEach(c => Console.WriteLine(c.ToString()));

1 int resCount = db.Database.ExecuteSqlCommand("update BlogUser set LoginName=@lname where id=28", new SqlParameter("lname", "xiaobai")); 2 MessageBox.Show(resCount.ToString());