在第一篇的基礎上,本文主要講解基於EntityFramework 及SqlServer2012 實現基本的CRUD功能。 一、設計錄入界面 創建一個錄入Form,用來管理UserAccount數據。 1.在項目文件上右鍵,選擇Add->New Item.. 2.選擇Windows 窗體 模板,將名字... ...
在第一篇的基礎上,本文主要講解基於EntityFramework 及SqlServer2012 實現基本的CRUD功能。
一、設計錄入界面
創建一個錄入Form,用來管理UserAccount數據。
1.在項目文件上右鍵,選擇Add->New Item..
2.選擇Windows 窗體 模板,將名字改為UserFrm.cs,點“Add”。
3.添加如下輸入框
二、保存操作
/// <summary> /// 新增數據 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Btn_Save_Click(object sender, EventArgs e) { using (OrderDBContainer db = new OrderDBContainer()) { UserAccout userAccout = new UserAccout(); userAccout.FirstName = this.FirstNameTxt.Text; userAccout.LastName = this.LastNameTxt.Text; userAccout.AuditFileds.UpdateDate = DateTime.Now; userAccout.AuditFileds.InsertDate = DateTime.Now; db.UserAccoutSet.Add(userAccout); db.SaveChanges(); MessageBox.Show("保存成功!"); } }
二、更新數據
EF的更新我瞭解的方式有如下三種(可能還有其他的方式)
【代碼如下】
方式一、只有FirstName的值會修改,很顯然如果欄位比較多,每個欄位都遍歷賦值是否修改,顯示不是很方便,故不建議使用,如果是使用框架模板另外說吧。
方式二、只有InsertDate 的值不會被修改,其他的欄位都會被修改,如果欄位比較多,錶面上看上去比較方便(只要設置不要修改的列就行了),測試過程中也發現弊端,如果實體中有不可為空欄位,且不再排除不保存的列的範圍內,則會導致保存失敗(如下圖)。
方式三,按我目前的理解水平,感覺是最靠譜的,從資料庫拿到數據後只要把需要改的值賦下就可以了(從高併發、高性能方向也有弊端,因為增加了資料庫的開銷,需要先要到數據映射到實體對象,在修改實體的屬性值,還要再保存到資料庫,明顯多了一次資料庫交互,而且如果實體對象比較大,對系統的開銷定會增加).
仁者見仁智者見智吧
/// <summary> /// 修改 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnUpdate_Click(object sender, EventArgs e) { using (OrderDBContainer db = new OrderDBContainer()) { //方案一:只有Modified = true的才修改 /* UserAccout userAccount = new UserAccout(); userAccount.FirstName = this.Txt_NewFirstName.Text; db.UserAccoutSet.Attach(userAccount); db.Entry(userAccount).Property(x => x.FirstName).IsModified = true; */ //方案二:只有Modified = true的才修改 /* UserAccout userAccount = new UserAccout(); userAccount.FirstName = this.Txt_NewFirstName.Text; userAccount.LastName = this.Txt_NewLastName.Text; userAccount.Id = Convert.ToInt32(CBox_User.SelectedValue); userAccount.AuditFileds.UpdateDate = DateTime.Now; userAccount.AuditFileds.InsertDate = DateTime.Now; db.Entry(userAccount).State = System.Data.Entity.EntityState.Modified; db.Entry(userAccount).Property(item =>item.AuditFileds.InsertDate).IsModified = false; //存在的問題複雜類型中有2個標量類型,設置其中一個標量屬性的IsModified為False時,整個複雜類型中的欄位都沒有存儲 */ //方案三 int userId = Convert.ToInt32(CBox_User.SelectedValue); var userSet = db.UserAccoutSet.Where(p => p.Id == userId).First(); userSet.FirstName = this.Txt_NewFirstName.Text; userSet.LastName = this.Txt_NewLastName.Text; userSet.AuditFileds.UpdateDate = DateTime.Now; db.SaveChanges(); MessageBox.Show("修改完成!"); } }
【遺留問題】//存在的問題複雜類型中有2個標量類型,設置其中一個標量屬性的IsModified為False時,整個複雜類型中的欄位都沒有存儲
如果有老師知道怎麼解決,求指點,不勝感謝。
三、查詢數據
/// <summary> /// 查詢數據綁定dataGirdView /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnQuery_Click(object sender, EventArgs e) { using (OrderDBContainer db = new OrderDBContainer()) { List<UserAccout> list = db.UserAccoutSet.Where(x =>x.FirstName == "zhou").ToList(); dataGridView1.DataSource = list; } }
四、刪除數據
/// <summary> /// 刪除 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnDelete_Click(object sender, EventArgs e) { using (OrderDBContainer db = new OrderDBContainer()) { //方式一、按員工的ID刪除 int userId = Convert.ToInt32(CBox_User.SelectedValue); UserAccout userSet = new UserAccout() { Id = userId }; db.Entry(userSet).State = System.Data.Entity.EntityState.Deleted; db.SaveChanges(); MessageBox.Show("刪除完成!"); } }
鏈接: https://pan.baidu.com/s/1i5cRdy9 密碼: z63m
打賞支付寶: