Entity Framework 6 +WinForm (第二篇) 使用Entity Framework 进行CRUD操作 【持续优化整理中】
在第一篇的基础上,本文主要讲解基于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
打赏支付宝: