EF之增刪改查


增成功后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
EF刪除

 

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             }
EF查詢 和 代理類 和 外鍵屬性(導航屬性)

 

 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()));
EF連接查詢
1 int resCount = db.Database.ExecuteSqlCommand("update BlogUser set LoginName=@lname where id=28", new SqlParameter("lname", "xiaobai"));
2             MessageBox.Show(resCount.ToString());
EF直接執行SQL語句

 


免責聲明!

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



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