1、codefrist与dbFirst
1)dbFirst
先建表,后开发实体
目前已经较少使用了
2)codeFirst
先确定实体模型再建表
3)操作
项目右键——添加——新建项——数据——ADO.NET实体数据模型——
使用dbFirst就选第一个
当我们创建好模型后生成一个后缀为edmx的文件,同时项目下会多一个packages目录
Nuget第三方包管理工具,可以引用第三方包到项目中
1)edmx文件
后缀为tt的文件不要改动,下面有为我们生成的实体类:
// 下面的实体类是根据数据库内容自动生成的 namespace Demo2 { using System; using System.Collections.Generic; public partial class Class { public Class() { this.user = new HashSet<user>(); } public int ClassId { get; set; } public string ClassName { get; set; } public virtual ICollection<user> user { get; set; } } }
此时,如果我们要对生成的实体类进行进一步的修改,不用直接修改上述代码,直接在面板上修改即可
.context.cs结尾的文件也很重要,里面的内容由模板生成
此时我们编写一个页面并添加事件把数据添加到数据库中:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { LoginUser user = new LoginUser(); user.Username = "Vitoria"; user.Password = "abcd"; //.context.cs中生成的类就是连接数据库的桥梁 DemoEntities db = new DemoEntities(); // 将数据添加到EF并添加了添加标记,但还未保存至数据库 db.LoginUser.Add(user); // 保存至数据库,Add标记就是添加操作,生成insert语句 db.SaveChanges(); // 拿到刚刚保存数据的id(主键) Response.Write(user.Id); } } }
来看看ef为我们自动生成的insert语句:
也避免了SQL注入的问题
select @@identity 返回所操作表记录的最后一行的主键
2、使用ef进行查询
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { DemoEntities db = new DemoEntities(); //linq表达式 IQueryable<LoginUser> userList = from u in db.LoginUser where u.Id == 2 select u; // 如果使用sql语句:select * from [LoginUser] where Id=2 foreach(LoginUser user in userList) { Response.Write(user.Username); } } } }
3、删除
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { DemoEntities db = new DemoEntities(); var userList = from u in db.LoginUser where u.Id == 1 select u; // 返回第一个元素,如果没有的话返回Null var user = userList.FirstOrDefault(); if (user != null) { db.LoginUser.Remove(user); db.SaveChanges(); Response.Write("已删除"); } else { Response.Write("未找到所要删除的数据"); } } } }
或者:
4、更新
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm1 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { DemoEntities db = new DemoEntities(); var userList = from u in db.LoginUser where u.Id == 3 select u; // 返回第一个元素,如果没有的话返回Null var user = userList.FirstOrDefault(); user.Password = "qweabc"; db.Entry<LoginUser>(user).State = System.Data.EntityState.Modified; db.SaveChanges(); Response.Write("完成修改"); } } }
5、modelFirst
根据业务需求创建实体,并建立各个实体间的关系
1)建立实体
右击项目——添加——新建项——空EF设计器模型——完成
空白处右键——新增——实体——设置类型
可在设计器上继续添加属性,但此时仍未创建实体
空白处右键——添加代码生成项——EF5.xDBContext代码生成器
就会出现tt文件
2)添加关联
空白处右键——新增——关联
多对多需要借助中间表进行关联
3)映射
将上面的实体模型映射到数据库上
空白处右键——根据模型生成数据库,根据提示进行操作,最后会生成一个DDL文件,本质上为一个sql文件
,打开sql文件,右键执行,即可在指定数据库中建立相应的表。但是要注意,如果后续需要根据项目需求添加新的
表或关联等等,生成的sql一定要把新生成的代码拷到数据库进行执行,直接执行将导致原来表中数据遗失。
4)导航属性
向数据库中存储数据:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); Customer customer1 = new Customer() { Name="John",Pwd="abc123"}; OtherInfo otherInfo1 = new OtherInfo() { CreateDate = DateTime.Now,Customer=customer1}; OtherInfo otherInfo2 = new OtherInfo() { CreateDate = DateTime.Now, Customer = customer1 };
// 注意添加的顺序 db.CustomerSet.Add(customer1); db.OtherInfoSet.Add(otherInfo1); db.OtherInfoSet.Add(otherInfo2); db.SaveChanges(); Response.Write("已经存储完成"); } } }
会不会发生某两条成功,一条失败的情况?
saveChanges()已经做了内部的事务处理,不会出现上述情况
查询数据:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); var customerList = from c in db.CustomerSet select c; foreach(var customer in customerList) { Response.Write(customer.Name); Response.Write("订单时间"); foreach (var otherInfo in customer.OtherInfo) { Response.Write(otherInfo.CreateDate); } } } } }
6、实践
1)查找某一客户的所有订单:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); var customerList = from c in db.CustomerSet where c.Id == 1 select c; var customer = customerList.FirstOrDefault(); foreach(var otherinfo in customer.OtherInfo) { Response.Write(otherinfo.CreateDate); } } } }
简化:
// 直接根据外键进行查找 var customerList = from o in db.OtherInfoSet where o.CustomerId == 1 select o;
2)根据订单号查用户是谁
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); // 根据导航属性进行查找 var ohterInfoList = from o in db.OtherInfoSet where o.Id == 2 select o; var otherInfo = ohterInfoList.FirstOrDefault(); Customer customer = otherInfo.Customer; Response.Write(customer.Name); } } }
3)删除某个客户下的所有订单
方法1:
Model2Container db = new Model2Container(); var customer = (from c in db.CustomerSet where c.Id == 1 select c).FirstOrDefault(); var otherInfoList = customer.OtherInfo; while (otherInfoList.Count> 0) { var otherInfo = otherInfoList.FirstOrDefault(); db.Entry<OtherInfo>(otherInfo).State = System.Data.EntityState.Deleted; //打上删除标记,自动-1 } db.SaveChanges();
方法2:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Demo2 { public partial class WebForm2 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); var otherInfoList = from o in db.OtherInfoSet where o.CustomerId == 2 select o; int count = otherInfoList.Count(); while (count > 0) { var otherInfo = otherInfoList.FirstOrDefault(); db.Entry<OtherInfo>(otherInfo).State = System.Data.EntityState.Deleted; db.SaveChanges(); count--; } Response.Write("ok"); } } }