学习 MVC - 第三部分:使用 EntityFramework 创建 MVC 应用程序并执行 CRUD 操作






4.92/5 (43投票s)
如何创建 MVC 应用程序并使用 EntityFramework 执行 CRUD 操作
- 下载 PDFArticle.zip - 2.1 MB
- 下载 LearningMVCPart1.zip - 2.3 MB
- 下载 SqlScriptToCreateTable.zip - 537 B
- 下载 SqlScriptToCreateDatabase.zip - 872 B
- 下载 LearningMVCWithEntityFrameworkPart3.zip - 2.3 MB
- 下载 Learning_MVC_Part_3_Creating_MVC_application_with_EntityFramework.zip - 6.6 MB
引言
在我们学习 MVC 的第一次和第二次尝试中,我们了解了什么是 MVC,什么是关注点分离,如何创建简单的 MVC 应用程序以及使用 LINQ to SQL 对应用程序执行 CRUD 操作。
本文重点介绍如何通过使用 ORM(实体框架)在 MVC 应用程序中执行 CRUD 操作。
本文旨在以非常简单的方式克服有关如何在 MVC 应用程序中使用 EntityFramework
的混淆。
我们的路线图
我们的路线图保持不变
- 第一部分:MVC 架构和关注点分离简介。
- 第二部分:从头开始创建 MVC 应用程序并使用 LINQ to SQL 将其连接到数据库。
- 第三部分:借助 EntityFramework DB-First 方法连接 MVC 应用程序。
- 第四部分:借助 EntityFramework Code-First 方法连接 MVC 应用程序。
- 第五部分:在带有 EntityFramework 的 MVC 应用程序中实现 Repository 模式。
- 第六部分:在带有 EntityFramework 的 MVC 应用程序中实现通用 Repository 模式和 Unit Of Work 模式。
先决条件
在开始阅读本文之前,有一些先决条件
- 我们有一个正在运行的示例应用程序,该应用程序是我们在此系列文章第二部分中创建的。
- 我们的本地文件系统上有
EntityFramework
4.1 包或 DLL。 - 我们理解如何创建 MVC 应用程序。
什么是 ORM 和 EntityFramework
?
现在,让我们看一下 Microsoft 提供的实体框架的标准定义
“Microsoft ADO.NET 实体框架是一个对象/关系映射 (ORM) 框架,它使开发人员能够将关系数据作为领域特定的对象进行处理,从而消除了开发人员通常需要编写的大部分数据访问基础结构代码。使用实体框架,开发人员可以使用 LINQ 发出查询,然后以强类型对象的形式检索和操作数据。实体框架的 ORM 实现提供了诸如更改跟踪、标识解析、延迟加载和查询转换等服务,使开发人员能够专注于应用程序特定的业务逻辑,而不是数据访问基础知识。”
简单来说,实体框架是一个对象/关系映射 (ORM) 框架。它是 ADO.NET 的增强功能,是 ADO.NET 的上层,为开发人员提供了一个自动化的机制来访问和存储数据库中的数据。
希望这能让你对 ORM 和 EntityFramework
有所了解。
EntityFramework 架构
让我们快速浏览一下 EntityFramework
的架构
我们的 Web 应用程序与实体数据模型(实体框架)交互,它充当 ADO.NET 提供程序和数据库之间的接口,按照图中描述的相同流程获取/保存数据。
在 MVC 应用程序中使用 EntityFramework 执行 CRUD 操作
打开我们使用 LINQ to SQL 创建的现有 Learning MVC 应用程序。
我对现有应用程序做了一些更改,以便在其中实现 EntityFramework
时更容易理解。
1. Changed the model class name from User to UserList,
2.
3. namespace LearningMVC.Models
4. {
5. #region User Model...
6. /// <summary>
7. /// User Model Class, purposely used for populating views and carry data from database.
8. /// </summary>
9. public class UserList
10. {
11. #region Automated Properties
12. public int UserId { get; set; }
13. public string FirstName { get; set; }
14. public string LastName { get; set; }
15. public string EMail { get; set; }
16. public string Address { get; set; }
17. public string PhoneNo { get; set; }
18. public string Company { get; set; }
19. public string Designation { get; set; }
20. #endregion
21. }
22. #endregion
23. }
2. Changed the Solution name from LearningMVC to LearningMVCWithEF
.
遵循的步骤
- 打开应用程序,根据上述更改进行修改。
- 从解决方案中删除 MyDBML.dbml 类。
- 现在不要构建解决方案,否则会导致错误,因为我们删除了 dbml 文件,所以访问 dbml 文件的控制器方法将引发编译时错误。
- 右键单击项目,然后添加新项,在已安装模板中选择数据,然后将 ADO.NET
EntityDataModel
添加到应用程序。将其命名为 EFDataModel.edmx。
- 将打开一个新窗口来选择模型内容,因为我们遵循数据库优先方法。
选择从数据库生成。
- 选择连接并将连接字符串命名为
MVCEntities
,如图所示,然后单击下一步。 - 提供现有数据库的连接详细信息,我们将其用于现有应用程序,数据库名称为 MVC。如果您没有现有的数据库,请使用附带的 db 脚本文件创建一个新的。
- 选择数据库对象,我们只有一个表,所以选择如图所示的那个,将模型命名空间命名为
MVCModel
。 - 我们在解决方案中获得了一个实体数据模型,即我们在上面实体框架架构中看到的。
- 在 web.config 中,您会看到已添加一个新的连接字符串。现在您可以注释/删除旧的 LINQ to SQL 连接字符串。
- 生成强类型实体模型类(来自博客)
现在我们将处理强类型实体类。实体数据模型设计器使用 Visual Studio 中的代码生成器,称为文本模板转换工具包 (T4)。实体框架将自动生成一个 User 类。代码生成器现在将根据我们的实体数据模型创建一个类。
默认情况下,设计器使用一个模板,该模板生成继承自实体框架
EntityObject
的实体类和一个继承自 EFObjectContext
的容器类。这些基类由于多种原因可能难以处理。虽然
ObjectContext
在需要大量控制实体框架行为时非常有用,但更轻量级的DbContext
提供了对最常用任务的访问,并简化了您的编码。Microsoft 提供了许多替代 T4 模板来从 EDM 生成类。当您安装 EF 4.1 时,一个用于创建包括
DbContext
在内的更简单类的模板已添加到 Visual Studio。让我们告诉设计器使用此模板而不是默认模板。- 右键单击模型的设计器表面。
- 在上下文菜单中,选择添加代码生成项。
- 在打开的“添加新项”对话框中,从左侧的已安装模板类型列表中选择“代码”。
- 选择 ADO.NET
DbContext
生成器,然后单击“添加”按钮。
解决方案资源管理器中将列出两个新文件:Model1.Context.tt 和 Model1.tt。这些是模板文件。展开模板以查看生成的类,如图所示。
- 当我们打开这两个新文件时,我们会看到上下文类已创建,用于访问模型,以及为我们的用户实体创建的模型类,并带有完整的代码。
您有没有注意到我们没有手动写一行代码?这就是
EntityFramework
带来的革命。让我们为我们的聪明才智鼓掌。
是时候写一些代码了
到目前为止,我们还没有写一行代码,但是要访问上下文类,我们需要在我们在教程第二部分中创建的控制器中,将从访问 LINQ to SQL 数据上下文到 EntityFramework
数据上下文的逻辑进行更改。
遵循的步骤
步骤 1:将所有视图绑定到 UserList
类,后来是 User 类,但我们将其更改为 UserList
类(还记得吗???)。
步骤 2:打开控制器,更改上下文类的访问机制,如下所示,例如,Index Action。
以前
public ActionResult Index()
{
var dbContext = new MyDBDataContext();
var userList = from user in dbContext.Users select user;
var users = new List<LearningMVC.Models.User>();
if (userList.Any())
{
foreach (var user in userList)
{
users.Add(new LearningMVC.Models.User()
{ UserId = user.UserId, Address = user.Address,
Company = user.Company, FirstName = user.FirstName,
LastName = user.LastName, Designation = user.Designation,
EMail = user.EMail, PhoneNo = user.PhoneNo });
}
}
ViewBag.FirstName = "My First Name";
ViewData["FirstName"] = "My First Name";
if(TempData.Any())
{
var tempData = TempData["TempData Name"];
}
return View(users);
}
现在
public ActionResult Index()
{
var dbContext = new MVCEntities() ;
var userList = from user in dbContext.Users select user;
var users = new List<LearningMVC.Models.UserList>();
if (userList.Any())
{
foreach (var user in userList)
{
users.Add(new LearningMVC.Models.UserList()
{ UserId = user.UserId, Address = user.Address,
Company = user.Company, FirstName = user.FirstName,
LastName = user.LastName, Designation = user.Designation,
EMail = user.EMail, PhoneNo = user.PhoneNo });
}
}
ViewBag.FirstName = "My First Name";
ViewData["FirstName"] = "My First Name";
if(TempData.Any())
{
var tempData = TempData["TempData Name"];
}
return View(users);
}
您可以看到我们只需要更改访问机制,只需要更改 2-3 行,而应用程序的逻辑没有任何变化。
步骤 3:同样,对所有 Action 执行相同的操作。我在这里不展示如何做,但您可以比较源代码,现在可以自己完成。
步骤 4:请注意,LINQ to SQL 上下文类使用 InsertOnSubmit()/DeleteOnSubmit()
和 SubmitChanges()
方法进行 Insert
、update
、Delete
,而 EF 上下文类使用 .Add()
、.SaveChanges()
。因此,在需要时要熟练地进行。
步骤 5:一切准备就绪,重新生成您的应用程序,您不会遇到任何错误。现在可以运行了。
步骤 6:运行应用程序时,它会像以前一样运行,现在您可以作为最终用户执行 CRUP 操作,并测试应用程序。
就这样,我们完成了实体框架的数据库优先方法。您可以再次鼓掌,然后休息一下。
结论
我们在 MVC 中已经迈出了高级 CRUD 操作的一步。在 MVC 和实体框架中还有更多内容需要学习,我们将在接下来的文章中介绍。在本文中,我们掌握了如何使用 EntityFramework
的数据库优先方法在 MVC 应用程序中执行 CRUD 操作,下一篇文章将重点介绍我最喜欢的 CodeFirst 方法。
编程愉快 :)