VS2010 EntityFramework Database First
本文演练介绍如何使用实体框架进行 Database First 开发。通过 Database First,可以从现有数据库对模型进行反向工程处理。模型存储在一个 EDMX 文件(扩展名为 .edmx)中,可在实体框架设计器中查看和编辑。应用程序中用于交互的类是自动从 EDMX 文件生成的。
必备条件
要完成本演练,需要安装 Visual Studio 2010 或 Visual Studio 2012。
如果使用的是 Visual Studio 2010,还需要安装 NuGet。
1.创建现有数据库
通常情况,是面向一个已创建的现有数据库,但在本演练中,我们需要创建一个数据库进行访问。
随 Visual Studio 安装的数据库服务器根据所安装的 Visual Studio 的版本而有所不同:
- 如果使用 Visual Studio 2010,则将创建 SQL Express 数据库。
- 如果使用的是 Visual Studio 2012,则将创建 LocalDb 数据库。
我们继续生成数据库。
- 打开 Visual Studio
- “视图”->“服务器资源管理器”
- 右键单击“数据连接”->“添加连接...”
- 如果尚未从服务器资源管理器连接至数据库,则需要选择 Microsoft SQL Server 作为数据源

- 根据已安装的数据库,连接到 LocalDb (localdb)\v11.0) 或 SQL Express (.\SQLEXPRESS),然手输入 DatabaseFirst.Blogging 作为数据库名称


- 选择“确定”,系统将询问是否要创建新数据库,选择“是”

- 新数据库此时出现在服务器资源管理器中,右键单击该数据库,然后选择“新建查询”

- 将以下 SQL 复制到新查询中,右键单击该查询,然后选择“执行”
CREATE TABLE [dbo].[Blogs] (
[BlogId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (200) NULL,
[Url] NVARCHAR (200) NULL,
CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
); CREATE TABLE [dbo].[Posts] (
[PostId] INT IDENTITY (1, 1) NOT NULL,
[Title] NVARCHAR (200) NULL,
[Content] NTEXT NULL,
[BlogId] INT NOT NULL,
CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
);
2.创建应用程序
为简单起见,我们将生成一个基本控制台应用程序,它使用 Database First 执行数据访问:
- 打开 Visual Studio
- “文件”->“新建”->“项目…”
- 从左侧菜单中选择“Windows”和“控制台应用程序”
- 输入 DatabaseFirstSample 作为名称
- 选择“确定”

3.对模型进行反向工程处理
我们使用 Visual Studio 中的实体框架设计器来创建模型。
- “项目”->“添加新项...”

- 从左侧菜单中选择“数据”,然后选择“ADO.NET 实体数据模型”

- 输入 BloggingModel 作为名称,然后单击“确定”
- 这会启动实体数据模型向导
- 选择“从数据库生成”,然后单击“下一步”

- 选择连接到在第一部分中创建的数据库,输入 BloggingContext 作为连接字符串的名称,然后单击“下一步”

- 单击“表”旁边的复选框,导入所有表,然后单击“完成”

反向工程处理完成后,新模型将添加到项目中并在实体框架设计器中打开以便查看。项目中还添加了一个 App.config 文件,其中含有数据库的连接详细信息。


Visual Studio 2010 中的其他步骤
如果用的是 Visual Studio 2010,则需要执行一些其他步骤升级到实体框架的最新版本。升级十分重要,因为升级后才能访问经过改进的 API 图面以及最新的 Bug 修复,改进的 API 图面使用起来更为方便。
首先,需要从 NuGet 获取实体框架的最新版本。
- “项目”–>“管理 NuGet 程序包…”
如果没有“管理 NuGet 程序包...”选项,则应安装 NuGet 的最新版本 - 选择“联机”选项卡
- 选择“EntityFramework”程序包
- 单击“安装”

接下来,需要交换模型,生成利用实体框架的早期版本中引入的 DbContext API 的代码。
- 在 EF 设计器中,右键单击模型上的空位置,选择“添加代码生成项...”

- 从左侧菜单中选择“联机模板”,然后搜索“DbContext”
- 选择“EF 5.x DbContext Generator for C#”,输入名称 BloggingModel,然后单击“添加”

4.读写数据
我们已有了模型,现在可以使用模型来访问一些数据。用于访问数据的类是基于 EDMX 文件自动生成的。
此屏幕快照来自 Visual Studio 2012,如果使用的是 Visual Studio 2010,则 BloggingModel.tt 和 BloggingModel.Context.tt 文件直接位于项目下面,而不是嵌套在 EDMX 文件下面。


实现 program.cs 中的 Main 方法,如下所示。这些代码为上下文创建一个新实例,然后使用该实例插入新博客。之后,它使用 LINQ 查询检索数据库中的所有博客(按标题的字母顺序进行排序)。
class Program
{
static void Main(string[] args)
{
using (var db = new BloggingContext())
{
// Create and save a new Blog
Console.Write("Enter a name for a new Blog: ");
var name = Console.ReadLine(); var blog = new Blog { Name = name };
db.Blogs.Add(blog);
db.SaveChanges(); // Display all Blogs from the database
var query = from b in db.Blogs
orderby b.Name
select b; Console.WriteLine("All blogs in the database:");
foreach (var item in query)
{
Console.WriteLine(item.Name);
}
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
现在,可以运行应用程序,对其进行测试。
All blogs in the database:
ADO.NET 博客
Press any key to exit...
5.处理数据库更改
现在,可以对数据库架构进行一些更改,在进行这些更改时,还需要更新模型,从而反映这些更改。
第一步是对数据库架构进行一些更改。我们将向架构添加一个用户表。
- 在服务器资源管理器中,右键单击 DatabaseFirst.Blogging 数据库,然后选择“新建查询”
- 将以下 SQL 复制到新查询中,右键单击该查询,然后选择“执行”
CREATE TABLE [dbo].[Users]
(
[Username] NVARCHAR(50) NOT NULL PRIMARY KEY,
[DisplayName] NVARCHAR(MAX) NULL
)
在更新架构之后,用这些更改来更新模型。
- 在 EF 设计器中,右键单击模型上的空位置,然后选择“从数据库更新模型...”,这会启动更新向导

- 在更新向导的“添加”选项卡上,选中“表”旁边的框,这表示需要从架构添加新表。
刷新”选项卡显示出模型中的所有现有表,在更新期间,将检查这些表有无更改。“删除”选项卡显示出已从架构删除并且在更新期间还将从模型删除的所有表。有关这两个选项卡的信息将被自动检测到,并仅出于参考目的而提供,您无法更改任何设置。

- 单击更新向导上的“完成”
模型进行更新,包括映射到我们已添加到数据库的用户表的新 User 实体。



摘要
本演练介绍了 Database First 开发,通过这种开发,可在 EF 设计器中基于现有数据库创建模型。随后,我们使用模型从数据库读写一些数据。最后,我们更新模型来反映对数据库架构进行的更改。
VS2010 EntityFramework Database First的更多相关文章
- [转]使用VS2010的Database 项目模板统一管理数据库对象
本文转自:http://www.cnblogs.com/shanyou/archive/2010/05/08/1730810.html Visual Studio 2010 有一个数据库项目模板:Vi ...
- Entity Framework应用:EntityFramework DataBase First模式
在这篇文章中讲解如何使用EF的DbFirst模式实现数据的增删改查 一.新建控制台应用程序,然后右键->添加新建项,选择数据里面的实体数据模型: 然后点击添加 二.选择来自数据库的EF设计器,并 ...
- EntityFramework:迁移工具入门
背景 刚毕业做项目的时候,没有用“迁移”这个概念,系统发布和更新的过程让人非常痛苦,在学习 Ruby On Rails 的过程解除了“迁移”,以后的所有项目都会先确定好“迁移”的方案,本文介绍一下En ...
- EntityFramework5提供的迁移工具
目录 背景之前是如何做的?EntityFramework5提供了更好的选择备注 背景返回目录 刚毕业做项目的时候,没有用“迁移”这个概念,系统发布和更新的过程让人非常痛苦,在学习 Ruby On Ra ...
- Entity Framework Context上下文管理(CallContext 数据槽)
Context上下文管理 Q1:脏数据 Q2:一次逻辑操作中,会多次访问数据库,增加了数据库服务器的压力 >在一次逻辑操作中实现上下文实例唯一 方法一:单例模式:内存的爆炸式增长 在整个运行期间 ...
- Database first with EntityFramework (Migration)安装和升级
最近看了国外几个项目,发现用EntityFramework做Code First的项目现在很流行. 最让我有兴趣的一个功能则是,EntityFramework对于数据库的安装和升级的无缝完美支持,且很 ...
- VS2010 下 将 EntityFramework 的版本从 4.0 升级到 5.0
1. 下载安装 EF 5.x DbContext Generator for C# : 下载地址:https://visualstudiogallery.msdn.microsoft.com/da74 ...
- EntityFramework(1)基础概念与Database First
基本概念 EntityFramework是微软推出的一款ORM工具,关于ORM的概念请参考博客https://www.cnblogs.com/huanhang/p/6054908.html.这篇文章对 ...
- C#+EntityFramework编程方式详细之Database First
Database First “Database First”模式即“数据库优先”,其实Database First 与Model First 很类似,只不过一个是有数据可一个是创建数据库,具体的操作 ...
随机推荐
- Php AES加密、解密与Java互操作的问题
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- Android获唯一标识
Android开发中有时候因业务需要客户端要产生一个唯一的标识符使服务器能识别某台Android设备,目前一般使用三种标识符分别为 DeviceId . AndroidId . MAC地址 . 获取D ...
- SCOM MP中的PowerShell脚本
该脚本可在MP中运行 #param ($file,$threshold) #此处可定义file 和 threshold 参数,该参数可以从脚本外部接收 $threshold = 10 $file = ...
- 项目androidAnt编译打包Android项目
时间紧张,先记一笔,后续优化与完善. Ant编译打包Android项目 在Eclipse中对Android项目停止编译和打包如果项目比较大的话会比较慢,所以改为Ant工具来停止编译和打包 Ant环境配 ...
- 区域医疗移动医疗影像解决方案2--基于FLEX的PACS
基于Flex的PACS和基于HTML5的PACS,都不是基于DICOM的WADO的方式,即所有的图像操作,移动.缩放.旋转.测量.伪彩.窗宽窗位调整等都是在本地浏览器能够完成,不用和服务器进行频繁的交 ...
- java.util.Scanner的日常用法
Scanner是新增的一个简易文本扫描器,在 JDK 5.0之前,是没有的.查看最新在线文档: public final class Scanner extends Object implements ...
- ios开发——实用技术篇&网络音频播放
网络音频播放 在日常的iOS开发中,我们通常会遇到媒体播放的问题,XCode中已经为我们提供了功能非常强大的AVFoundation框架和 MediaPlayer框架.其中AVFoundation框架 ...
- careercup-C和C++ 13.4
13.4 深拷贝和浅拷贝有什么区别,如何使用? 解答 浅拷贝并不复制数据,只复制指向数据的指针,因此是多个指针指向同一份数据. 深拷贝会复制原始数据,每个指针指向一份独立的数据.通过下面的代码, 可以 ...
- Folder and jar
- 用keytool生成证书
1.创建一个证书C:/jdk1.5.0_04/bin>keytool -genkey -alias xahCA -keyalg RSA -keystore dyfCALib输入keystore密 ...