65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (10投票s)

2012年7月9日

CPOL

3分钟阅读

viewsIcon

81756

downloadIcon

1889

在 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 操作的多对多关系。我使用了三个表CustomerProductCustomerProduct。我正在使用 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 操作非常有用。 我需要您对本文的意见。 不要忘记评价它。

© . All rights reserved.