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

面向初学者的 Entity Framework 教程

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (63投票s)

2014 年 3 月 5 日

CPOL

5分钟阅读

viewsIcon

584373

downloadIcon

18801

一个简单的入门教程,帮助初学者学习 Entity Framework 的基础知识。它将教您如何使用 EF 执行 CRUD 操作。

引言

在本文中,我们将通过创建一个示例应用程序来学习 Entity Framework 的基础知识。本文适合有 ASP.NET 应用程序开发经验,但对 Entity Framework 不熟悉的程序员。在这里,我将解释

  • 如何创建实体数据模型
  • 执行 CRUD 操作
  • 使用存储过程

这是您将要创建的应用程序的快速概览

背景

有许多文章教授 Entity Framework 的基础知识。但在本文中,您将通过创建一个简单的单页应用程序来学习。

什么是 Entity Framework?

  • 对象/关系映射 (ORM) 框架
  • 将数据库视为领域特定对象进行处理
  • 以强类型对象的形式检索和操作数据

Using the Code

该应用程序是使用 Visual Studio 2010 创建的。应用程序的完整代码已在此处附上,您可以下载并进行测试。示例代码包含相关的注释来解释每一步。让我们一步一步地回顾一下这个应用程序。

启动一个新项目

启动一个新的“ASP.NET Web 应用程序”,如下图所示

创建数据库

在这里,我们将使用一个非常简单的数据库,名为 LearnEF,只有一个表。Employee 表将包含一个员工列表,其中包含每个员工的基本信息。您可以使用以下脚本来创建应用程序中使用的表和存储过程。

CREATE TABLE Employee
(
    EmpId        int NOT NULL IDENTITY(1,1) PRIMARY KEY,
    HREmpId        nvarchar(10),
    FirstName    nvarchar(30),
    LastName    nvarchar(30),
    Address        nvarchar(30),
    City        nvarchar(30)
)
GO
 
--SearchEmployee '', ''
CREATE PROCEDURE SearchEmployee
(
    @FirstName        varchar(30),
    @City            varchar(30)
)
AS
BEGIN
    DECLARE @query    nvarchar(1000)
 
    SET @query = 'SELECT * FROM Employee e'
    SET @query = @query + ' WHERE 1=1'
 
    IF @FirstName != ''
        SET @query = @query + ' AND FirstName LIKE ''' + @FirstName + '%'''
 
    IF @City != ''
        SET @query = @query + ' AND City LIKE ''' + @City + '%'''
 
 
    EXEC (@query)
END
GO

注意:我的一些朋友会很快注意到上面的存储过程容易受到 SQL 注入攻击,我同意这一点。这是因为我试图使代码保持简单易懂,而且本文是关于 Entity Framework 的。请忽略此问题,如果您真的关心这个问题,请参考有关 SQL 注入的高级教程。

创建实体数据模型

现在,让我们创建实体数据模型。以下是详细步骤:

  1. 右键单击项目名称,选择“添加” -> “新建项”。
  2. 从左侧窗格中选择“数据”选项卡,然后选择 ADO.NET 实体数据模型。
  3. 将其命名为 _LearnEF.edmx_。单击“添加”。
  4. 在实体数据模型向导中选择“从数据库生成”。
  5. 在下一个窗口中,设置数据库的连接属性,然后单击“下一步”。
  6. 下一个窗口将显示数据库中的对象。选择 Employee 表和 SearchEmployee 存储过程。

  7. 单击“完成”。如果您已成功完成以上步骤,您将在设计模式下看到您的 EDM,如下图所示

注意:本文使用的数据库名称是 LearnEF,因此系统将生成一个名为 LearnEFEntitiesObjectContext 类。同样,系统将根据表名创建一个名为 Employee EntityObject 类型的类。如上快照所示,有一个名为 SearchEmployee 的存储过程,因此 LearnEFEntities 类将公开一个名为 SearchEmployee 的相应方法。

如果您的数据库/表/存储过程名称不同,请记住相应地修改代码。

插入新记录

要插入新记录

  1. 创建一个对象上下文的实例,即 LearnEFEntities
    LearnEFEntities db = new LearnEFEntities();
  2. 创建一个 Employee 类的实例,例如:
    Employee objEmp = new Employee();  
  3. 设置以属性形式暴露的所有列的值,例如:
    objEmp.FirstName = txtFirstName.Text; 
  4. 将对象添加到 ObjectContext 的 Employees 集合中,并调用 SaveChanges 以实际将记录插入到表中
    db.Employees.AddObject(objEmp); 
    db.SaveChanges();  

这是一个完整的代码片段

LearnEFEntities db = new LearnEFEntities();

Employee objEmp = new Employee();
objEmp.HREmpId = txtHREmpId.Text;
objEmp.FirstName = txtFirstName.Text;
objEmp.LastName = txtLastName.Text;
objEmp.Address = txtAddress.Text;
objEmp.City = txtCity.Text;
 
db.Employees.AddObject(objEmp);
db.SaveChanges();

从 Employee 表读取并填充 GridView

要从 Employee 表中读取数据,我们将使用一个 LINQ 查询,它将从 Employees 集合中获取数据。它将返回一个 Employee 类型的通用列表,即 List<Employee>。从 Employee 表中读取数据然后绑定下拉列表和 GridView 的完整代码如下

LearnEFEntities db = new LearnEFEntities();
 
var empQuery = from emp in db.Employees
                select emp;
List<Employee> empList = empQuery.ToList();
 
ddlEmployee.DataSource = empList;
ddlEmployee.DataValueField = "EmpId";
ddlEmployee.DataTextField = "FirstName";
ddlEmployee.DataBind();
 
ddlEmployee.Items.Insert(0, new ListItem("--Add New--", "0"));
 
//bind grid
GridView1.DataSource = empList;
GridView1.DataBind();

更新 Employee 记录

要更新数据库中的记录,我们将执行以下三个步骤:

  1. 从数据库中读取一条记录。过程与上一节的说明类似。
  2. 设置我们要修改的属性(列)的新值。
  3. 使用 SaveChanges 方法将更改保存到数据库。
 //Read the record from the database.
 LearnEFEntities db = new LearnEFEntities();
 
 //following query will fetch a record based upon the EmpID passed through local variable empId
 var empQuery = from emp in db.Employees
                 where emp.EmpId == empId
                 select emp;
 Employee objEmp = empQuery.Single();
 
 //set the new values of the columns (properties), based upon the values entered using the text boxes
 objEmp.HREmpId = txtHREmpId.Text;
 objEmp.FirstName = txtFirstName.Text;
 objEmp.LastName = txtLastName.Text;
 objEmp.Address = txtAddress.Text;
 objEmp.City = txtCity.Text;
 
 //save your changes into the database
 db.SaveChanges(); 

如何删除记录

使用 Entity Framework 删除记录有多种方法。我们采用的方法涉及以下步骤:

  1. 创建一个您想要删除的实体对象的新实例,并设置将用于过滤要删除的记录的属性的值。在这种情况下,我们将创建一个新的 Employee 对象并设置其 EmpID 属性的值。
  2. 将对象附加到对象上下文中相应的集合或实体集。
  3. 使用 DeleteObject() 方法将对象标记为删除。
  4. 使用 SaveChanges() 方法从数据库中删除记录。

以下代码将阐明上述删除记录的步骤

LearnEFEntities db = new LearnEFEntities();
 
//create a new object using the value of EmpId
Employee objEmp = new Employee() { EmpId = empId };
 
//attach object in the entity set
db.Employees.Attach(objEmp);

//mark the object for deletion
db.Employees.DeleteObject(objEmp);
 
//save changes
db.SaveChanges(); 

如何在 Entity Framework 中使用存储过程

我们也可以在 Entity Framework 中使用存储过程。要使用存储过程,我们必须先将其添加到实体数据模型中,然后为该存储过程生成一个方法。请注意,在本文开头创建实体数据模型时,我们选择了 SearchEmployee 存储过程。现在,我们将使用存储过程添加搜索功能。为此,我们必须为存储过程添加一个方法并定义其返回类型,在本例中是 Employee 对象的集合。以下是步骤:

  1. 双击 _LearnEF.edmx_
  2. 右键单击主窗格,然后选择“模型浏览器”。
  3. 在模型浏览器中展开“存储过程”节点,右键单击 SearchEmployee 存储过程,然后单击“添加函数导入”。

  4. 将“返回实体集合”的值设置为“实体”,然后从下拉列表中选择 Employee
  5. 单击“确定”,现在我们就可以使用此存储过程了。

在上述步骤中,我们实际上在对象上下文中添加了一个 SearchEmployee 方法,该方法将返回一个 Employee 类型的列表。使用此方法的语句将是:

List<Employee> empList = db.SearchEmployee(txtSrchFirstName.Text, txtSrchCity.Text).ToList();

可以使用以下代码片段搜索员工并绑定网格

List<Employee> empList = db.SearchEmployee(txtSrchFirstName.Text, txtSrchCity.Text).ToList();
 
//bind grid
GridView1.DataSource = empList;
GridView1.DataBind(); 
© . All rights reserved.