您的位置:首页 > 编程语言 > ASP

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:

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(一个客户可以有多个订单)。不是集合类型。
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  asp asp.net c# EF框架