Entity Framework 绝对初学者入门






4.74/5 (237投票s)
为绝对初学者介绍 Entity Framework。
引言
本文向绝对初学者介绍 Entity Framework。本文面向主要使用 ADO.NET 编写数据访问层(Data Access Layer)的开发人员。许多有经验的开发人员会觉得本文非常基础,但由于本文是从初学者的角度编写的,我尽量保持内容简单。
背景
ADO.NET 是一个非常强大的数据访问框架。ADO.NET 已经存在多年,有大量的系统运行在 ADO.NET 之上。对于完全不了解 ORM(对象关系映射)概念的开发人员,他们可能会问:“Entity Framework 是什么?使用它有什么好处?它是否是 ADO.NET 的替代品?”
那么,为了回答第一个关于 Entity Framework 是什么的问题,Entity Framework 是一个对象关系映射器(ORM)。它基本上根据数据库表生成业务对象和实体,并提供了一个机制来:
- 执行基本的 CRUD(创建、读取、更新、删除)操作。
- 轻松管理“一对一”、“一对多”和“多对多”关系。
- 实体之间拥有继承关系的能力。
以及回答第二个问题,其好处包括:
- 我们可以用更高级的语言编写所有数据访问逻辑。
- 可以使用实体之间的关系以更好的方式表示概念模型。
- 由于所有数据访问逻辑都存在于更高级别,因此可以以较小的开销替换底层数据存储。
最后,关于它是否是 ADO.NET 的替代品,答案是“是也不是”。说是,因为开发人员将不再编写 ADO.NET 方法和类来执行数据操作;说不是,因为这个模型实际上是建立在 ADO.NET 之上的,这意味着在这个框架下,我们仍在 HADO.NET。所以,让我们来看看 Entity Framework 的架构(图来自 MSDN)。
使用代码
让我们通过执行简单的 CRUD 操作来尝试理解 Entity Framework 提供的易用性。一旦我们看到了代码以及我们能多么轻松高效地完成这些操作,Entity Framework 的好处就会变得相当明显。
创建数据库
让我们创建一个只有一张表的简单数据库。让我们为“联系人”(Contacts)创建一个简单的表,然后我们将在这个表上执行 CRUD 操作。
将实体模型添加到网站
数据库准备好后,我们可以将实体模型添加到我们的网站。我们可以通过向网站添加一个 *ADO.NET 实体数据模型* 来做到这一点。
一旦我们选择将此数据模型添加到我们的网站,我们将需要选择我们希望用于模型内容的实现方式。
这个选择意味着我们可以选择从现有数据库模式生成实体模型,或者我们可以在此处设计实体模型,然后稍后将其连接到数据库。由于我们已经准备好了数据库,我们将使用第一个选项。模型生成后,每个表的实体都会被生成。我们联系人表的生成的实体是
此外,还将创建用于执行数据库操作的类。我们只需要知道如何使用这些类来执行数据库操作。
插入操作
让我们创建一个简单的页面来执行插入操作。
现在,一旦用户选择将值插入数据库,就可以通过使用模型类实体集合的 `AddObject` 方法来执行实际的数据操作。以下代码片段展示了如何执行插入。
Contact con = new Contact();
con.fname = TextBox1.Text;
con.lname = TextBox2.Text;
con.phone = TextBox3.Text;
ContactsDb db = new ContactsDb();
db.Contacts.AddObject(con);
db.SaveChanges();
这将向表中插入一条记录。您可以注意到我们编写的代码来执行插入的简洁性和高效性。
读取所有记录
有时我们需要读取所有记录。假设我们正在创建一个页面,该页面将在单个页面上显示所有联系人信息。
我们可以使用模型对象检索实体集合来实现这一点。下面的代码片段将展示如何做到这一点。
ContactsDb db = new ContactsDb();
Repeater1.DataSource = db.Contacts;
Repeater1.DataBind();
选择特定记录
如果我们想从表中选择一条特定记录,我们可以使用模型实体集合上的 `SingleOrDefault` 方法。假设我们希望在单个页面上进行更新/删除记录的功能,那么我们首先需要根据 ID 选择记录,然后更新/删除所选记录。
可以这样根据 ID 选择任何特定记录(`Contact`):
int idToupdate = Convert.ToInt32(Request.QueryString["id"].ToString());
ContactsDb db = new ContactsDb();
Contact con = db.Contacts.SingleOrDefault(p => p.id == idToupdate);
此代码执行后,`Contact` 对象将包含所需的值。
更新记录
如果我们想更新一条记录,那么一个简单的更新操作可以这样执行:
int idToupdate = Convert.ToInt32(Request.QueryString["id"].ToString());
ContactsDb db = new ContactsDb();
Contact con = db.Contacts.SingleOrDefault(p => p.id == idToupdate);
con.phone = TextBox1.Text;
db.SaveChanges();
此代码执行后,电话号码的值将通过从 `TextBox1` 检索的新值进行更新。
删除记录
如果我们想删除一条特定记录,我们可以使用 `DeleteObject` 函数执行删除操作。以下代码片段演示了这一点:
//delete this contact
int idToupdate = Convert.ToInt32(Request.QueryString["id"].ToString());
ContactsDb db = new ContactsDb();
Contact con = db.Contacts.SingleOrDefault(p => p.id == idToupdate);
db.Contacts.DeleteObject(con);
db.SaveChanges();
现在我们已经使用 Entity Framework 在数据库上执行了基本 CRUD 操作。
关于关系和延迟加载的说明
要理解 Entity Framework,我们需要了解一些东西,例如命名约定、表之间的关系以及实体之间的关系。此外,一旦完全理解了延迟加载的概念,开发人员就可以高效地使用 Entity Framework。
注意:由于这是一篇关于 Entity Framework 的入门文章,我们没有讨论这些内容。也许我们会在另一篇文章中讨论它们。
关注点
Entity Framework 已经使用一段时间了。但仍有许多开发人员才刚开始接触 Entity Framework。本文旨在概述 Entity Framework。这不应被视为完整的教程。此外,编写的代码非常简单,并且有很大的优化空间,但由于这里的想法是理解 Entity Framework,我试图让代码保持简单易读,而不是最优。
注意:要运行解决方案,请在 `web.config` 文件中更改 `ConnectionString` 的数据库路径。
历史
- 2012 年 4 月 9 日:初稿。