面向初学者的 Entity Framework 教程






4.76/5 (63投票s)
一个简单的入门教程,帮助初学者学习 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 注入的高级教程。
创建实体数据模型
现在,让我们创建实体数据模型。以下是详细步骤:
- 右键单击项目名称,选择“添加” -> “新建项”。
- 从左侧窗格中选择“数据”选项卡,然后选择 ADO.NET 实体数据模型。
- 将其命名为 _LearnEF.edmx_。单击“添加”。
- 在实体数据模型向导中选择“从数据库生成”。
- 在下一个窗口中,设置数据库的连接属性,然后单击“下一步”。
- 下一个窗口将显示数据库中的对象。选择
Employee
表和SearchEmployee
存储过程。 - 单击“完成”。如果您已成功完成以上步骤,您将在设计模式下看到您的 EDM,如下图所示
注意:本文使用的数据库名称是 LearnEF
,因此系统将生成一个名为 LearnEFEntities
的 ObjectContext
类。同样,系统将根据表名创建一个名为 Employee
的 EntityObject
类型的类。如上快照所示,有一个名为 SearchEmployee
的存储过程,因此 LearnEFEntities
类将公开一个名为 SearchEmployee
的相应方法。
如果您的数据库/表/存储过程名称不同,请记住相应地修改代码。
插入新记录
要插入新记录
- 创建一个对象上下文的实例,即
LearnEFEntities
LearnEFEntities db = new LearnEFEntities();
- 创建一个
Employee
类的实例,例如:Employee objEmp = new Employee();
- 设置以属性形式暴露的所有列的值,例如:
objEmp.FirstName = txtFirstName.Text;
- 将对象添加到
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 记录
要更新数据库中的记录,我们将执行以下三个步骤:
- 从数据库中读取一条记录。过程与上一节的说明类似。
- 设置我们要修改的属性(列)的新值。
- 使用
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 删除记录有多种方法。我们采用的方法涉及以下步骤:
- 创建一个您想要删除的实体对象的新实例,并设置将用于过滤要删除的记录的属性的值。在这种情况下,我们将创建一个新的
Employee
对象并设置其EmpID
属性的值。 - 将对象附加到对象上下文中相应的集合或实体集。
- 使用
DeleteObject()
方法将对象标记为删除。 - 使用
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
对象的集合。以下是步骤:
- 双击 _LearnEF.edmx_
- 右键单击主窗格,然后选择“模型浏览器”。
- 在模型浏览器中展开“存储过程”节点,右键单击
SearchEmployee
存储过程,然后单击“添加函数导入”。 - 将“返回实体集合”的值设置为“实体”,然后从下拉列表中选择
Employee
。 - 单击“确定”,现在我们就可以使用此存储过程了。
在上述步骤中,我们实际上在对象上下文中添加了一个 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();