《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式
作者:张博
出处:http://yilin.cnblogs.com
Entity Framework支持Database First、Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样。三种开发模式各有优缺点,对于程序员没有哪种模式最好,只有哪种模式更适合。接下来我将分别使用这三种开发模式实现同一数据库模型的数据持久化功能。希望通过实践能帮助你找到更适合你的开发模式。
Database First
Database First开发模式指以数据库设计为基础,并根据数据库自动生成实体数据模型,从而驱动整个开发流程。该模式的好处在于使用简单,容易入手。
为了降低学习难度,本文的数据库模型设计得尽量简单,如下图所示:
图1数据库模型图
对应的DDL语句如下:

- 1 --创建表
- 2 CREATE TABLE [User](
- 3 [ID] [uniqueidentifier] NOT NULL,
- 4 [Name] [nvarchar](40) NOT NULL,
- 5 PRIMARY KEY CLUSTERED([ID] ASC) ON [PRIMARY])
- 6 GO
- 7
- 8 CREATE TABLE [Role](
- 9 [ID] [uniqueidentifier] NOT NULL,
- 10 [Name] [nvarchar](40) NOT NULL,
- 11 PRIMARY KEY CLUSTERED([ID] ASC) ON [PRIMARY])
- 12 GO
- 13
- 14 CREATE TABLE [UserRole](
- 15 [UserID] [uniqueidentifier] NOT NULL,
- 16 [RoleID] [uniqueidentifier] NOT NULL,
- 17 PRIMARY KEY CLUSTERED([UserID] ASC, [RoleID] ASC) ON [PRIMARY])
- 18 GO
- 19
- 20 --创建外键
- 21 ALTER TABLE [UserRole] WITH CHECK ADD CONSTRAINT [FK_UserRole_User] FOREIGN KEY([UserID])
- 22 REFERENCES [User] ([ID])
- 23 ON DELETE CASCADE
- 24 GO
- 25
- 26 ALTER TABLE [UserRole] WITH CHECK ADD CONSTRAINT [FK_UserRole_Role] FOREIGN KEY([RoleID])
- 27 REFERENCES [Role] ([ID])
- 28 ON DELETE CASCADE
- 29 GO

创建名为“DatabaseFirst”的数据库,并执行以上的DDL语句,就可以建立本示例所需的数据库对象了。
在Visual Studio解决方案的DatabaseFirst项目中,添加一个名为DatabaseFirst.edmx的ADO.NET实体数据模型,如下图所示:
图2添加ADO.NET实体数据模型
点击“添加”按钮后,进入创建实体数据模型向导的选择模型内容界面,如下图所示:
图3选择从数据库生成模型
选择“从数据库生成”图标,并点击“下一步”按钮,进入选择数据连接界面,如下图所示:
图4设置数据连接
指定你的本地数据连接,选择“是,在连接字符串中包括敏感数据”选项,并为实体连接设置名称为“DatabaseFirst”,点击“下一步”按钮,进入选择数据库对象界面,如下图所示:
图5选择数据库对象
可供选择的数据库对象包括表、视图和存储过程。按上图所示设置后,点击“完成”按钮,Visual Studio将自动完成从Database到实体数据模型的生成工作。如下图所示:
图6由数据库生成的实体对象模型
至于生成内容的细节,在此就不作说明了,后续会用一整篇文章来深入剖析实体数据模型的方方面面。
至此,实体数据模型的建立算是完成了。在测试项目的应用程序配置文件中加入数据库连接配置,如下所示:

- 1 <?xml version="1.0" encoding="utf-8"?>
- 2 <configuration>
- 3 <connectionStrings>
- 4 <add name="DatabaseFirst" providerName="System.Data.EntityClient"
- 5 connectionString="provider=System.Data.SqlClient;
- 6 provider connection string="
- 7 Data Source=localhost;
- 8 User Id=sa;
- 9 Password=11111111;
- 10 Initial Catalog=DatabaseFirst;
- 11 Integrated Security=False;
- 12 MultipleActiveResultSets=True;";
- 13 metadata=res://*/DatabaseFirst.csdl|
- 14 res://*/DatabaseFirst.ssdl|
- 15 res://*/DatabaseFirst.msl"/>
- 16 </connectionStrings>
- 17 </configuration>

使用该实体数据模型的测试代码如下:

- 1 using Apollo.Blog.EF.Chapter2.DatabaseFirst;
- 2 …
- 3
- 4 using (var db = new DatabaseFirst.DatabaseFirst())
- 5 {
- 6 var role = new Role();
- 7 role.ID = Guid.NewGuid();
- 8 role.Name = "Administrator";
- 9 db.Roles.AddObject(role);
- 10
- 11 var user = new User();
- 12 user.ID = Guid.NewGuid();
- 13 user.Name = "Apollo";
- 14 user.Roles.Add(role);
- 15 db.Users.AddObject(user);
- 16
- 17 db.SaveChanges();
- 18 }

Model First
Model First开发模式是指从建立实体数据模型入手,并依据模型生成数据库,从而驱动整个开发流程。该模式也就是业界流行的面向领域的编程模式,它的优点在于,程序员可以用与设计建模相同的思维来进行代码编写,更符合面向对象的思想。Model First与Database First是互逆的,但最终都是输出数据库和实体数据模型。
在Visual Studio解决方案的ModelFirst项目中,添加一个名为ModelFirst.edmx的ADO.NET实体数据模型,如下图所示:
图7添加ADO.NET实体数据模型
点击“添加”按钮后,进入创建实体数据模型向导的选择模型内容界面,如下图所示:
图8选择空模型进行建模
选择“空模型”,点击“完成”按钮,,Visual Studio将新建一个空的实体数据模型。如下图所示:
图9生成的空模型
工具箱中提供了建模需要的实体、关联和继承元素。通过使用这些元素,建立如下的实体数据模型:
图10手动建模
用XML(文本)编辑器的方式打开ModelFirst.edmx文件,可以看到SSDL和MSL部分的映射代码是空的,而只产生了CSDL部分的代码;与此同时,查看ModelFirst.Designer.cs文件,发现实体类和上下文环境类已经创建了。我们只需将SSDL和MSL部分的代码产生就大功告成了。
首先,先使用SQL Server Management Studio工具创建一个名为ModelFirst的空数据库,如下图所示:
图11创建数据库
。然后,在Visual Studio中双击ModelFirst.edmx,回到模型关系图视图,在视图的空白处点击鼠标右键,打开右键菜单,如下图所示:
图12根据模型生成数据库
选择“根据模型生成数据库”菜单项,将进入“生成数据库”向导,如下图所示:
图13设置数据库连接
选择ModelFirst数据连接(如果是第一次使用钙连接,请使用 “新建连接”按钮新建一个指向ModelFirst数据库的连接),并按上图所示设置后,点击“下一步”按钮,进入“摘要和设置”界面,如下图所示:
图14自动生成的DDL内容
此时,Visual Studio已经自动生成了DDL语句,点击“完成”按钮,将ModelFirst.edmx.sql文件加入项目中。此时,再用XML(文本)编辑器的方式打开ModelFirst.edmx文件,可以看到SSDL和MSL部分的映射代码也已经生成了。对比ModelFirst和DatabaseFirst生成的.edmx文件和.Designer.cs后台文件,会发现两者内容其实是一样的。
数据库对象的生成有两种方式,一种是在SQL Server Management Studio中执行ModelFirst.edmx.sql;另一种是使用生成的上下文环境类创建:
- 1 using (var db = new ModelFirst.ModelFirstContainer())
- 2 {
- 3 if (!db.DatabaseExists())
- 4 db.CreateDatabase();
- 5 }
至此,实体数据模型的建立算是完成了。在测试项目的应用程序配置文件中加入数据库连接配置,如下所示:

- 1 <?xml version="1.0" encoding="utf-8"?>
- 2 <configuration>
- 3 <connectionStrings>
- 4 <add name="ModelFirstContainer" providerName="System.Data.EntityClient"
- 5 connectionString="provider=System.Data.SqlClient;
- 6 provider connection string="
- 7 Data Source=localhost;
- 8 User Id=sa;
- 9 Password=11111111;
- 10 Initial Catalog=ModelFirst;
- 11 Integrated Security=False;
- 12 MultipleActiveResultSets=True;";
- 13 metadata=res://*/ModelFirst.csdl|
- 14 res://*/ModelFirst.ssdl|
- 15 res://*/ModelFirst.msl"/>
- 16 </connectionStrings>
- 17 </configuration>

使用该实体数据模型的测试代码如下:

- 1 using Apollo.Blog.EF.Chapter2.ModelFirst;
- 2 …
- 3
- 4 using (var db = new ModelFirst.ModelFirstContainer())
- 5 {
- 6 var role = new Role();
- 7 role.ID = Guid.NewGuid();
- 8 role.Name = "Administrator";
- 9 db.Roles.AddObject(role);
- 10
- 11 var user = new User();
- 12 user.ID = Guid.NewGuid();
- 13 user.Name = "Apollo";
- 14 user.Roles.Add(role);
- 15 db.Users.AddObject(user);
- 16
- 17 db.SaveChanges();
- 18 }

Code Only
Code Only开发模式也叫Code First开发模式,指的是程序员完全通过手动编码,就可以使用Entity Framewokr技术来实现数据访问。该模式的优点在于,支持POCO(Plain Old CLR Objects,简单传统CLR对象),代码整洁,程序员对代码的控制也更灵活自如。Code Only模式的代码结构如下图所示:
图15 Code Only开发模式的代码结构
Code Only开发模式需要Entity Framework Feature CTP支持,建议下载并安装最新的Entity Framework Feature CTP 5。安装后,Visual Studio解决方案的为CodeOnly项目添加该组件安装目录下的EntityFramework.dll库引用。
接下来在该项目中添加Role和User两个POCO类。其中,Role.cs主要代码如下:

- 1 public class Role
- 2 {
- 3 public Guid ID { get; set; }
- 4
- 5 public string Name { get; set; }
- 6
- 7 public IList<User> Users { get; set; }
- 8 }

User.cs主要代码如下:

- 1 public class User
- 2 {
- 3 public Guid ID { get; set; }
- 4
- 5 public string Name { get; set; }
- 6
- 7 public IList<Role> Roles { get; set; }
- 8 }

然后,创建一个对象上下文环境EntityContext.cs,主要代码如下:

- 1 using System.Data.Entity;
- 2 …
- 3 public class EntityContext : DbContext
- 4 {
- 5 public EntityContext() : base("CodeOnly") { }
- 6
- 7 public DbSet<Role> Roles { get; set; }
- 8
- 9 public DbSet<User> Users { get; set; }
- 10 }

OK,实体数据模型建成了。在测试项目的应用程序配置文件中加入数据库连接配置,如下所示:

- 1 <?xml version="1.0" encoding="utf-8"?>
- 2 <configuration>
- 3 <connectionStrings>
- 4 <add name="CodeOnly" connectionString="data source=YILIN;initial catalog=CodeOnly;persist security info=True;user id=sa;password=11111111" providerName="System.Data.SqlClient"/>
- 5 </connectionStrings>
- 6 </configuration>

使用该实体数据模型的测试代码如下:

- 1 using (var db = new EntityContext())
- 2 {
- 3 db.Database.CreateIfNotExists();
- 4
- 5 var role = new Role();
- 6 role.ID = Guid.NewGuid();
- 7 role.Name = "Administrator";
- 8 db.Roles.Add(role);
- 9
- 10 var user = new User();
- 11 user.ID = Guid.NewGuid();
- 12 user.Name = "Apollo";
- 13 user.Roles = new List<Role>() { role };
- 14 db.Users.Add(user);
- 15
- 16 Assert.IsTrue(db.SaveChanges() > 0);
- 17 }

可以看到,得益于Entity Framework Feature CTP 5对Entity Framework的扩展,使得我们以Code Only模式编程时,几乎感觉不到Entity Framework的存在,也就是几乎不用做另外的事情去适应它,这是一件很美好的事情。并且,微软官方承诺了将把Entity Framework Feature CTP 5的内容纳入到.NET Framework的后续版本中,届时将不再需要另外下载并安装Entity Framework Feature CTP 5,Entity Framework本身就支持这些特性了。
总结
本文依次使用Entity Framework支持的Database First、Model First和Code Only三种开发模式实现数据的快速访问。Database First是Entity Framework最早支持,也是最容易上手的一种开发模式,建议初学者选择该模式入手;Model First模式也即面向领域的编程模式,该模式更能体现面向对象的思想;Code Only模式适合对Entity Framework技术较熟悉的程序员,它能让你的代码更整洁、更易维护。
接下来,我将对实体数据模型进行剖析,详细讲解Entity Framework如何实现对象-关系映射这一ORM的核心功能;在此基础上,给出一种DIY实体数据模型,实现对POCO和多数据库的支持。
《ASP.NET MVC4 WEB编程》学习笔记------Entity Framework的Database First、Model First和Code Only三种开发模式的更多相关文章
- Asp.net MVC4高级编程学习笔记-视图学习第一课20171009
首先解释下:本文只是对Asp.net MVC4高级编程这本书学习记录的学习笔记,书本内容感觉挺简单的,但学习容易忘记,因此在边看的同时边作下了笔记,可能其它朋友看的话没有情境和逻辑顺序还请谅解! 一. ...
- Asp.net MVC4高级编程学习笔记-视图学习第三课Razor页面布局20171010
Razor页面布局 1) 在布局模板页中使用@RenderBody标记来渲染主要内容.比如很多web页面说头部和尾部相同,中间内容部分使用@RenderBody来显示不同的页面内容. 2) 在布局 ...
- Asp.net MVC4高级编程学习笔记-模型学习第四课基架与模型绑定20171027
MVC模型 一.构建基架. MVC中的基架可以为应用程序提供CURD各种功能生成所需要的样板代码.在添加控制器的时候可以选择相应的模板以及实体对象来生成相应的模板代码. 首先定义一个模型类如下所示: ...
- Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101
MVC表单和HTML辅助方法 一.表单的使用. 表单中的action与method特性.Action表示表单要提交往那里,因此这里就有一个URL.这个URL可以是相对或绝对地址.表单默认的method ...
- EF3:Entity Framework三种开发模式实现数据访问
前言 Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对 ...
- Entity Framework:三种开发模式实现数据访问
原文地址 http://blog.csdn.net/syaguang2006/article/details/19606715 前言 Entity Framework支持Database First. ...
- ASP.NET MVC Web API 学习笔记---第一个Web API程序
http://www.cnblogs.com/qingyuan/archive/2012/10/12/2720824.html GetListAll /api/Contact GetListBySex ...
- ASP.NET的三种开发模式
前言 ASP.NET 是一个免费的Web开发框架,是由微软在.NET Framework框架中所提供的,或者说ASP.NET是开发Web应用程序的类库,封装在System.Web.dll 文件中.AS ...
- 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序
1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...
随机推荐
- oracle 的安装脚本
==[root@oracle ~]# cat 1.preusers.sh ==#!/bin/bash#Purpose:Create 3 groups named 'oinstall','dba','o ...
- WPF--调用线程必须为 STA,因为许多 UI 组件都需要(转载)
自VS2005开始,UI元素在不同线程中访问就受到限制了,当然你也可以解除这种限制 以下提供Framework3.0的解决方案发: public partial class Window1 : Win ...
- hdu2222 字典树
要注意二点 . 这组数据 1 6 she he he say shr her yasherhs出现重复的,也要算.所以这里答案为4: 这一组 1 6 she he he say shr her yas ...
- POJ1325 Machine Schedule
Description As we all know, machine scheduling is a very classical problem in computer science and h ...
- Bzoj2705 Longge的问题
Time Limit: 3000MS Memory Limit: 131072KB 64bit IO Format: %lld & %llu Description Longge的数学 ...
- Fast-cgi cgi nginx php-fpm 的关系 (转
Fast-cgi cgi nginx PHP-fpm 的关系 Fast-cgi是由cgi发展而来,是http服务器(http,nginx等)和动态脚本语言(php,perl等)之间的的通信接口, ...
- 机器人与机器人仿真技术(zz)
http://www.viblue.com/archives/5587.htm 一.机器人简介: 机器人(Robot)是自动执行工作的机器装置.它既可以接受人类指挥,又可以运行预先编排的程序,也可以根 ...
- LUA的编译、环境等
Lua的环境.编译等 Lua命令行 lua命令行选项: -i:进入交互式 -e:执行lua代码 -l:加载库文件 例如使用下面的命令启动lua解释器,可以重新定义lua提示符. lua -i -e & ...
- String与Date、Timestamp互转
一.String与Date(java.util.Date)互转 1.1 String -> Date String dateStr = "2010/05/04 12:34:23&quo ...
- Vim常用操作(1)-常用指令
1.清空文件内容 Normal模式下,先输入"gg",将光标定位到文件首,然后输入"dG",文件就被清空了.当然也可以直接输入"ggdG".