ASP EF框架,实体框架(EntityFramework),ModelFirst,导航属性(一对多的表关系,外键)
2018-01-07 14:33
453 查看
ModelFirst:EF框架自动根据实体模型设计器(*.edmx)生成数据库、数据层和model。
项目--添加--新建项--数据--ADO.NET实体数据模型--空模型--右击--新增--实体--实体名称(Use)、一定要选择创建主键ID--点击模型主键ID(Identity(自增)、为Null(false)、实体键(True),三个属性表示主键)--模型头部右击--新增--标量属性--UseName--点击UserName设置类型、约束(String类型要指定最大长度)--保存--覆盖--会在.tt文件下生成对应的实体类--空白处右击--新增--关联--选择实体、对应关系(一定要勾选导航属性)--空白处右击--根据模型生成数据库--新建连接--选择数据库(空的数据库)--确定--下一步--完成--覆盖--利用SQL脚本文件生成数据库(VS中打开.sql文件,空白处右击执行)
WebForm2.aspx.cs:
Customer.cs(model):
项目--添加--新建项--数据--ADO.NET实体数据模型--空模型--右击--新增--实体--实体名称(Use)、一定要选择创建主键ID--点击模型主键ID(Identity(自增)、为Null(false)、实体键(True),三个属性表示主键)--模型头部右击--新增--标量属性--UseName--点击UserName设置类型、约束(String类型要指定最大长度)--保存--覆盖--会在.tt文件下生成对应的实体类--空白处右击--新增--关联--选择实体、对应关系(一定要勾选导航属性)--空白处右击--根据模型生成数据库--新建连接--选择数据库(空的数据库)--确定--下一步--完成--覆盖--利用SQL脚本文件生成数据库(VS中打开.sql文件,空白处右击执行)
WebForm2.aspx.cs:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebApplication1 { 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(); //Model2.Context.cs中的类。(上下文类,都是通过该类实现和数据库的交互) Customer customer = new Customer() {CustomerName="zhangsan",CustomerPwd="123", SubTime=DateTime.Now }; //可以不指定导航属性OrderInfo的值。 OrderInfo orderInfo1 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "10001", CreateDateTime = DateTime.Now,Customer=customer }; //指定导航属性Customer的值。 OrderInfo orderInfo2 = new OrderInfo() { ID = Guid.NewGuid(), OrderNum = "10002", CreateDateTime = DateTime.Now, Customer = customer }; db.Customer.Add(customer); //先添加Customer,再添加OrderInfor。 db.OrderInfo.Add(orderInfo1); db.OrderInfo.Add(orderInfo2); db.SaveChanges();//默认的已经开启了事务。 工作单元模式(UnitOfwork),只连接一次数据库,执行多条SQL语句。 } //查询所有客户,及其订单 protected void Button2_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); var customerList = from c in db.Customer select c; //查询所有 foreach (var customer in customerList) //延迟加载。只有用到的时候才去数据库中查询。 { Response.Write(customer.CustomerName+":"); foreach (var orderInfo in customer.OrderInfo) //查询导航属性的值 { Response.Write(orderInfo.OrderNum); } } } //根据条件查询。查询某个客户的所有订单。 protected void Button3_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); /*第一种方式,两次查询 var customerInfoList = from c in db.Customer where c.ID == 1 select c; //根据条件查询,第一次查询 var customerInfo = customerInfoList.FirstOrDefault(); foreach (var orderInfo in customerInfo.OrderInfo) //查询导航属性(订单),第二次查询 { Response.Write(orderInfo.OrderNum); } */ //第二种方式,一次查询 var orderInfoList = from o in db.OrderInfo where o.CustomerID == 1 select o; //一次查询,通过指定订单的外键(不是导航属性),作为查询条件。 foreach (var orderInfo in orderInfoList) { Response.Write(orderInfo.OrderNum); } } //根据条件查询。查询某个订单的客户信息。 protected void Button4_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); var orderInfoList = from o in db.OrderInfo where o.OrderNum == "10001" select o; //查询某个订单 var orderInfo = orderInfoList.FirstOrDefault(); Customer customer = orderInfo.Customer; //通过导航属性,获取该订单的客户信息。 Response.Write(customer.CustomerName); } //删除某个客户的所有订单。 protected void Button5_Click(object sender, EventArgs e) { Model2Container db = new Model2Container(); /*第一种方式。查询了两次。 var customer = (from c in db.Customer where c.ID == 1 select c).FirstOrDefault(); //第一次查询。 var orderInfoList = customer.OrderInfo; //导航属性,集合类型。第二次查询。 while (orderInfoList.Count > 0) //循环删除该客户的所有订单。 { var orderInfo = orderInfoList.FirstOrDefault(); db.Entry<OrderInfo>(orderInfo).State = System.Data.EntityState.Deleted; //打上删除标记。集合的Count属性会减一。 } db.SaveChanges(); //执行删除操作。 */ //第二种方式。通过外键查询,查询了一次。 var orderList = from o in db.OrderInfo where o.CustomerID == 2 select o; //通过外键查询。 foreach (var orderInfo in orderList) //循环删除所有订单。 { db.Entry<OrderInfo>(orderInfo).State = System.Data.EntityState.Deleted; //打上删除标记。 } db.SaveChanges(); //执行删除操作。 } } }
Customer.cs(model):
//------------------------------------------------------------------------------ // <auto-generated> // 此代码是根据模板生成的。 // // 手动更改此文件可能会导致应用程序中发生异常行为。 // 如果重新生成代码,则将覆盖对此文件的手动更改。 // </auto-generated> //------------------------------------------------------------------------------ namespace WebApplication1 { using System; using System.Collections.Generic; public partial class Customer { public Customer() { this.OrderInfo = new HashSet<OrderInfo>(); } public int ID { get; set; } public string CustomerName { get; set; } public string CustomerPwd { get; set; } public System.DateTime SubTime { get; set; } public virtual ICollection<OrderInfo> OrderInfo { get; set; } //导航属性,一个Customer对应多个OrderInfo(一个客户可以有多个订单)。是集合类型。 } }OrderInfo.cs(model):
//------------------------------------------------------------------------------ // <auto-generated> // 此代码是根据模板生成的。 // // 手动更改此文件可能会导致应用程序中发生异常行为。 // 如果重新生成代码,则将覆盖对此文件的手动更改。 // </auto-generated> //------------------------------------------------------------------------------ namespace WebApplication1 { using System; using System.Collections.Generic; public partial class OrderInfo { public System.Guid ID { get; set; } public string OrderNum { get; set; } public System.DateTime CreateDateTime { get; set; } public int CustomerID { get; set; } public virtual Customer Customer { get; set; } //导航属性,一个Customer对应多个OrderInfo(一个客户可以有多个订单)。不是集合类型。 } }
相关文章推荐
- EF实体框架-从数据库更新模型 一部分表的外键(导航属性)无法显示
- ASP EF框架,实体框架(EntityFramework),DataBaseFirst
- EF Code First 导航属性 与外键(转载)
- EF Code First 导航属性 与外键
- 数据库——实体框架关系与导航属性
- EF CodeFirst 关系与导航属性
- EF Code First 导航属性 与外键 学习笔记
- EF Code First 导航属性 与外键
- 形成查询结果(实体框架)- 使用导航属性导航关系
- EF框架step by step(5)—处理实体简单属性
- ASP.NET EF 延迟加载,导航属性延迟加载
- 【EF】EntityFrameWork实体关系映射
- EF之Code First设置主外键关系(二)
- 请教:.net实体框架中有外键关系数据表的数据显示
- EF框架—Model-First
- Asp.net mvc + .net ef database first 或 model first 时如何添加验证特性
- 【EF】ModelFirst实体优先
- [C#/.NET]Entity Framework(EF) Code First 多对多关系的实体增,删,改,查操作全程详细示例
- EF之Code First设置主外键关系(三)
- EFCode First 导航属性