在 ASP.NET GridView 中使用 Entity Framework 实现多对多关系的一种简化方法






4.73/5 (10投票s)
在 ASP.NET WebForms 中使用 Entity Framework 实现多对多关系和 CRUD 操作。
引言
当我开始搜索关于在 Web 中使用 Entity Framework (EF) 的 ASP.NET 文章时,我发现很少,大多数文章是关于 ASP.NET MVC 而不是 ASP.NET WebForms 的。
我努力寻找一篇关于使用 Entity Framework 在 ASP.NET 中执行 *CRUD* (创建、读取、更新和删除) 操作的文章,使用 Gridview(多对多关系)。我在网上找不到任何合适的文章。
最终,它使我能够编写这篇文章,该文章涵盖了使用 Entity Framework 和 ASP.NET WebForms 支持的 CRUD 操作。
关于 Entity Framework 的简要介绍
最基本的问题是什么是Entity Framework
?使用 ADO.NET Entity Framework 而不是使用 ADO.NET 有什么优势?简单来说,EF 可以减少您执行 CRUD (创建、读取、更新和删除) 的工作量。无需编写任何查询,您可以通过 EF 和 LINQ 的支持来执行 CRUD 操作。要利用 EF,您必须创建 .edmx 文件。您可以导入所需的表和过程。它会根据关系自动生成代码。(表创建为类,列创建为属性,您也可以重命名它们)。
ADO.NET Entity Framework 使开发人员能够通过针对概念应用程序模型进行编程,而不是直接针对关系存储架构进行编程来创建数据访问应用程序。 目标是减少面向数据的应用程序所需的代码量和维护量。 Entity Framework 应用程序提供以下优势
入门
在本文中,我主要关注使用 EF 和 Linq 执行 CRUD 操作的多对多关系。我使用了三个表Customer,Product和CustomerProduct。我正在使用 EF 和 LINQ 执行插入,更新和删除操作。
数据库图
Entity Framework ER 图(显示 Customer 和 Product 之间的关系(在代码Model1.edmx中))
以下屏幕显示了 UI 部分。(添加产品,添加客户以及在 GridView 中更新和删除客户详细信息)
使用代码
全局创建 Edmx 类的对象
ManyToManyEntities manyToMany = new ManyToManyEntities();
添加产品:(在 AddProduct 按钮点击事件中)
创建 Product
类的对象,并设置 ProductName
属性。 最后将 Product
对象添加到 EDMX 对象(manyToMany)。
Product p = new Product();
//Set the ProductName property from textbox.
p.ProductName = txtProd.Text.Trim();
manyToMany.Products.AddObject(p);
manyToMany.SaveChanges();
添加客户:(在 AddCustomer 按钮点击事件中)
创建 Customer
类的对象,并根据 ProdId 从 Product 集合的 ProdId 下拉列表中获取单个 Product
对象。将 Product
添加到 Customer 对象。最后将 Customer 对象添加到 manyToMany 对象。
简单地说,将所有集合详细信息添加到 Customer
对象,最后将 Customer
对象添加到 Edmx 对象 (manyToMany) 并调用 SaveChanges()
方法。
注意:无需编写代码即可将记录插入到 CustomerProduct
表中。 Entity Framework 将自动处理代码以插入关系记录。
//Get ProductId from Dropdown selection.
int ProdId = Convert.ToInt32(drpProd.SelectedValue);
Customer c = new Customer();
/Set Customer Name property
c.CustName = txtCus.Text.Trim();
//Get single product object from collection.
Product p = manyToMany.Products.SingleOrDefault(x => x.ProductId == ProdId);
//Add Product details to customer
c.Products.Add(p);
//Add customer details to EDMX class object
manyToMany.Customers.AddObject(c);
//Call SaveChanges method. Saving the records in DB will occur only when you call the SaveChanges Method.
manyToMany.SaveChanges();
lblMessage.Text = "Customer Added successfully";
要检索客户详细信息,包括相关产品详细信息,并在 Gridview
中显示。
注意:无需基于某些条件连接两个表。 这是我希望在本文中分享的主要内容。 这有点棘手,并且与常规连接略有不同。
var _custProList =(from c in manyToMany.Customers.Where(prod => prod.Products.Any())
from p in manyToMany.Products.Where(cust => cust.Customers.Contains(c))
select new { c.CustomerId, c.CustName, p.ProductId, p.ProductName });
grdDetails.DataSource = _custProList;
grdDetails.DataBind();
示例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ManyToMany
{
public partial class _Default : System.Web.UI.Page
{
ManyToManyEntities manyToMany = new ManyToManyEntities();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Bind Dropdown details.
this.BindDropdownDetails();
this.BindGridDetails();
}
}
protected void btnCust_Click(object sender, EventArgs e)
{
//set Default value as empty for error message.
lblMessage.Text = string.Empty;
try
{
//Get ProductId from Dropdown selection.
int ProdId = Convert.ToInt32(drpProd.SelectedValue);
Customer c = new Customer();
//Set Customer Name property
c.CustName = txtCus.Text.Trim();
//Get Prodct
Product p = manyToMany.Products.SingleOrDefault(x => x.ProductId == ProdId);
//Add Product details to customer
c.Products.Add(p);
//Add customer details to EDMX class object
manyToMany.Customers.AddObject(c);
//Call SaveChanges method. Saving the records in DB will occur only when you call the SaveChanges Method.
manyToMany.SaveChanges();
this.BindDropdownDetails();
lblMessage.Text = "Customer Added successfully";
lblMessage.ForeColor = System.Drawing.Color.Green;
lblMessage.Font.Bold = true;
this.BindGridDetails();
txtCus.Text = string.Empty;
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
}
}
protected void btnProd_Click(object sender, EventArgs e)
{
//set Default value as empty for error message.
lblMessage.Text = string.Empty;
try
{
Product p = new Product();
//Set the ProductName property from textbox.
p.ProductName = txtProd.Text.Trim();
manyToMany.Products.AddObject(p);
manyToMany.SaveChanges();
this.BindDropdownDetails();
lblMessage.Text = "Product Added successfully";
lblMessage.ForeColor = System.Drawing.Color.Green;
lblMessage.Font.Bold = true;
txtProd.Text = string.Empty;
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
}
}
protected void grdDetails_RowEditing(object sender, GridViewEditEventArgs e)
{
grdDetails.EditIndex = e.NewEditIndex;
this.BindGridDetails();
}
protected void grdDetails_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
int CustId = Convert.ToInt32(((Label)grdDetails.Rows[e.RowIndex].FindControl("lblCusId")).Text);
int ProdId = Convert.ToInt32(((Label)grdDetails.Rows[e.RowIndex].FindControl("lblPId")).Text);
Customer cus = (from c in manyToMany.Customers where c.CustomerId == CustId select c).FirstOrDefault();
cus.CustName = e.NewValues["CustName"].ToString();
Product prod = (from p in manyToMany.Products where p.ProductId == ProdId select p).FirstOrDefault();
prod.ProductName = ((DropDownList)grdDetails.Rows[e.RowIndex].FindControl("drpProd1")).SelectedItem.Text;
prod.ProductId = Convert.ToInt32( ((DropDownList)grdDetails.Rows[e.RowIndex].FindControl("drpProd1")).SelectedItem.Value);
manyToMany.Customers.ApplyCurrentValues(cus);
manyToMany.Products.ApplyCurrentValues(prod);
manyToMany.SaveChanges();
grdDetails.EditIndex = -1;
this.BindDropdownDetails();
this.BindGridDetails();
}
protected void grdDetails_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
int CustId = Convert.ToInt32(((Label)grdDetails.Rows[e.RowIndex].FindControl("lblCusId")).Text);
int ProdId = Convert.ToInt32(((Label)grdDetails.Rows[e.RowIndex].FindControl("lblPId")).Text);
Customer cus = (from c in manyToMany.Customers where c.CustomerId == CustId select c).First();
Product prod = (from p in manyToMany.Products where p.ProductId == ProdId select p).First();
cus.Products.Attach(prod);
manyToMany.Customers.DeleteObject(cus);
manyToMany.SaveChanges();
this.BindGridDetails();
}
protected void grdDetails_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
grdDetails.EditIndex = -1;
this.BindGridDetails();
}
#region Binding Dropdowns & GridView
private void BindGridDetails()
{
var _custProList = (from c in manyToMany.Customers.Where(f => f.Products.Any())
from p in manyToMany.Products.Where(g => g.Customers.Contains(c))
select new { c.CustomerId, c.CustName, p.ProductId, p.ProductName });
grdDetails.DataSource = _custProList;
grdDetails.DataBind();
}
private void BindDropdownDetails()
{
//set Default value as empty for error message.
lblMessage.Text = string.Empty;
try
{
drpProd.Items.Clear();
drpProd.Items.Add(new ListItem("--Select--", ""));
drpProd.DataTextField = "ProductName";
drpProd.DataValueField = "ProductId";
drpProd.DataSource = manyToMany.Products;
drpProd.DataBind();
}
catch (Exception ex)
{
lblMessage.Text = ex.Message;
}
}
#endregion
protected void grdDetails_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
LinkButton lnk1 = (LinkButton)e.Row.Cells[e.Row.Cells.Count - 1].Controls[2];
if(lnk1.Text=="Delete")
lnk1.Attributes.Add("onclick", "if(window.confirm('Are you sure,You want to delete?'))return true;else return false;");
DropDownList drpProd = (DropDownList)e.Row.FindControl("drpProd1");
Label lblPId = (Label)e.Row.FindControl("lblPId");
int Pid = Convert.ToInt32(lblPId.Text);
drpProd.Items.Clear();
drpProd.Items.Add(new ListItem("--Select--", ""));
drpProd.DataTextField = "ProductName";
drpProd.DataValueField = "ProductId";
drpProd.DataSource = manyToMany.Products;
drpProd.DataBind();
drpProd.SelectedValue = Pid.ToString();
}
}
}
}
摘要
本文对于如何使用 ASP.NET Entity Framework 执行 CRUD 操作非常有用。 我需要您对本文的意见。 不要忘记评价它。