原文发表地址:VS 2010 SP1 AND SQL CE
原文发表时间:January 11, 2011
上个月我们发布了VS 2010 Service Pack 1 (SP1)Beta . 你可以在Jason Zander的两篇博文和Scott Hanselman包含了VS 2010 SP1 Beta的一些新功能的博文中了解更多关于VS 2010 SP1 Beta的信息。你可以从这里下载和安装VS 2010 SP1 Beta。
上周我发表了关于VS2010 SP1中新增的对 IIS Express的支持的博文。今天的博文中我将要讨论一些支持SQL CE的VS2010 SP1工具支持,并且逐步讲一些它实现的很酷的应用场景。
SQL CE—它是什么?为什么要关注它?
SQL CE是一个免费的,可嵌入的数据库引擎,它使数据库存储变得容易。
不需要数据库安装
SQL CE使你不必运行可执行程序或者安装一个数据库服务器来使用它。你可以简单地把SQL CE文件复制到ASP.NET应用程序的\bin目录中,然后你的web应用程序就能把它当作数据库引擎来用。运行时不需要安装或安全许可。在机器上你不必具有管理员账户。只要把你的web应用程序复制到任何一个服务器上,它就能工作。对运行在虚拟主机环境中的中度信任应用程序也是如此。
SQL CE在ASP.NET应用程序的内存中运行,当你第一次访问一个SQL CE数据库时它会启动,并且当应用程序被卸载后它会自动关闭。SQL CE数据库被作为ASP.NET应用程序中的\App_Data下的文件形式存储。
使用已有的数据API
SQL CE4使用现有的基于.NET的数据API,也支持SQL服务器兼容的查询语法。这意味着你可以使用现有的数据API像ADO.NET,也可以使用高级别的ORM,例如实体框架和配有SQL CE的Nhibernate。这使你可以使用你现在所掌握的同样的数据编程技术和数据API。
支持开发,测试和生产案例
SQL CE可被用在开发案例,测试案例和轻量级的产品使用案例。在SQL CE4版本中我们已经做了一些工程技术工作来确保在多线程服务器场景(比如 ASP.NET)中,SQL CE不会出现故障或死锁。这是针对SQL CE上一个版本的一个大的改动—之前是只为客户场景设计的,这显然阻碍了其在web 服务器环境中的运行。从SQL CE4开始, 你也可以在web服务器中使用它。
SQL CE没有许可证限制,它也是完全免费的
很容易移植到SQL服务器
SQL CE是一个嵌入式数据库—这使得它对开发,测试,和轻量级的使用场景是很理想化的。对于高容量的站点和应用程序,你也许想把数据库迁移至使用SQL Server Express(这是免费的),SQL Server或SQL Azure。这些服务器有更好的可扩展性,更多开发功能(功能如存储过程—SQL CE不支持),也包括更多高级数据管理能力。
我们将发布迁移工具,这可以使你根据需要使用SQL CE数据库,并很容易地把它们升级到使用SQL Server Express,SQL服务器,或SQL Azure。当把一个SQL CE数据库升级到SQL服务器或SQL Azure时,你不必改变代码。我们的目的是使你能够在web.config文件中仅改变数据库连接字符串就能使你的应用程序正好工作。
VS 2010 SP1 中适用于SQL CE的新工具支持
VS 2010 SP1包含了改善很多的工具支持SQL CE,并且第一次添加了对ASP.NET工程中SQL CE使用的支持。使用VS 2010 SP1,你现在可以:
· 创建新的SQL CE数据库
· 编辑和修改SQL CE数据库架构和索引
· 用数据填充SQL CE数据库
· 用实体框架(EF)设计器创建与SQL CE数据库匹配的模型层
· 使用实体框架代码优先(EF Code First)定义代码里的模型层,然后从它们里创建一个SQL CE数据库,根据需要用VS编辑数据库。
· 用web部署(Web Deploy)将SQL CE数据库部署到远程服务器,根据需要将它们转换到完整的SQL服务器数据库。
你可以在ASP.NET Web 窗体和基于ASP.NET MVC 的工程中使用上面所有的功能。
下载
通过安装 VS 2010 SP1 (beta)你可以获得VS2010中SQL CE工具支持。
装了SP1 之后,你也需要安装针对 Visual Studio 的SQL CE 工具下载。这是一个单独的下载,它使SQL CE工具支持VS2010SP1 。
演示两个场景
在本篇博客中我将通过一个ASP.NET 窗体和和一个基于ASP.NET MVC的应用程序来演示SQL CE 和VS 2010 SP1的使用 。具体来说或,我们将逐步讲解:
· 怎样使用VS 2010 SP1 创建SQL CE 数据库,然后使用Visual Studio的EF4 可视化设计器来建立一个模型层,然后用ASP.NET GridView控件来显示和编辑数据。
- 怎样用EF代码优先程序定义一个使用POCO类的模型层,然后使EF代码优先程序基于模型类“自动地创建”一个SQL CE 数据库。我们就看看怎样使用VS 2010 SP1对SQL CE的新支持来查阅已建立的数据库,用数据填充它,在以后改变它的架构。我们会在基于 ASP.NET MVC 的应用程序背景下做这些 .。
通过安装 VS 2010 SP1 (beta),然后安装 适用于Visual Studio下载的SQL CE 工具(这是一个独立的下载,它能使SQL CE工具支持VS 2010 SP1)你可以在你的机器上做下面的两个步骤 。
步骤1:创建一个SQL CE数据库,创建EF模型类,用GridView修改数据
第一个步骤将会演示在一个ASP.NET Web Form 应用程序中怎样创建和定义一个SQL CE数据库。然后我们会为它创建一个EF模型层以通过一个<asp:GridView>控件来修改数据。
第一步:创建一个新的ASP.NET Web Form程序
在Visual Studio中从文件->新项目菜单命令开始,创建一个新的ASP.NET Web Form工程。我们将用“ASP.NET Web Application”工程模板选项,以使它应用有默认的UI皮肤:
第二步:创建一个SQL CE数据库
在创建的工程中右击“App_Data”文件夹,选择“添加->新的项”菜单命令:
这将会显示“添加项”对话框。选择“SQL Server Compact 4.0 Local Database”项(在VS 2010 SP1中新增的)并将数据库文件命名,创建“Store.sdf”:
注意SQL CE数据库文件有一个.sdf文件扩展名。把他们放到ASP.NET 应用程序的/App_Data文件夹里,使它更容易部署。
当点击上面的“添加”按钮时,一个Store.sdf文件就会被添加到我们的程序中:
第三步: 添加一个“Products” 表
在Server Explorer 选项卡中双击“Store.sdf”数据库文件将会打开它。由于它是一个新的数据库,所以里面没有表格:
在“Tables”图标上右击,选择“Create Table” 菜单命令创建一个新的数据链表格。我们将为它命名为“Products” 并为它添加4列。我们将把第一列标记为主键(并把它作为一个标识列以使它的值会随着每个新的行自动增加) :
当点了“ok”后我们的产品表格会在SQL CE数据库中被创建。
第四步:用数据填充
一旦产品表格创建了,它就会在Server Explorer中显示出来。我们可以右击它,选择“Show Table Data”菜单命令修改它里面的数据:
让我们对它来添加一些数据样本行:
步骤5:创建一个 EF模型层
我们有一个里面含有数据的SQL CE数据库—现在就让我们来创建一个EF模型层来为我们提供一个简单的方法来查询并更新它里面的数据。
在工程上右击,选择“添加->新的项”菜单命令。将会弹出一个“添加新项”对话框—选择里面的“ADO.NET Entity Data Model”选项,并将其命名为“Store.edmx”。
这就会在我们的解决方案资源管理器中添加一个新的Store.edmx项并启动一个允许我们快速地创建一个EF 模型的向导:
选择上面的“Generate From Database”选项并点击下一步。选择刚才创建的Store.sdf SQL CE数据库,然后再次点击下一步。
向导会问你想要导入到模型中的是什么数据库对象。我们就选择导入之前建立的“Products” 表格:
当点击“Finish”按钮,Visual Studio将会打开EF设计器。它上面会出现一个已有的映射到我们的SQLCE数据库中”Product”表的产品实体:
VS 2010 SP1 EF设计器和SQL CE配合工作得相当好,就像它和SQL Server 和 SQL Express工作一样。上面的产品实体会被当作一个类(称为“Product”),我们能在ASP.NET应用程序中编程处理它。
第六步:编译工程
在使用模型层之前你需要创建一个工程。使用Ctrl+Shift+B键来编译程序,或者用Build->Build Solution菜单命令来完成。
第七步:用EF模型层创建一个页面
现在让我们来创建一个包含GridView控件的简单的ASP.NET Web Form,我们可以用它来显示和编辑我们的产品数据(通过我们刚创建的EF模型层)。
右击工程,选择添加->新的项命令。选择“Web Form from Master Page”选项模板,并把你创建的页面命名为“Products.aspx”。把主页建立在项目的根部的“Site.Master”模板上。
添加一个顶端有<h2>Products</h2>的新页面,同时在它里面添加一个<asp:gridview>控件:
然后点击“Design” 选项卡 转到设计视图。选择GridView空间,然后点击右上角来显示GridView的“智能标记”UI:
选择上面圈出部分的“New data source…”下拉选项。这会产生下面的让你选择你的数据源类型的对话框:
选择“Entity”数据源选项–它会使我们很容易地从我们的GridView连接到我们早先建立的EF模型层。这会产生另一个对话框:
在下拉选项中选择“StoreEntities”–这是我们以前建立的EF模型层。然后点击下一步–这会让我们选择我们想要绑定到的实体:
在上面的对话框中选择“Products”实体–这表明我们我们想要绑定到我们之前定义的“Product”实体类。然后点击“Enable automatic updates”复选框以确保我们可以查询和更新Products。当点击“Finish” VS会显示一个<asp:EntityDataSource>到<asp:GridView>控件:
我们将要做的最后两步是在表格中点击“Enable Editing”复选框(这将会使网格在每行显示出“Edit”连接),并且(有选择性地)使用Auto Format对话框来为网格选择一个UI模板。
第八步:运行程序
现在就让我们来运行下我们的程序,并浏览包含有GridView的/Products.aspx页面。这样做了之后,我们将会在SQL CE数据库中看到Products的一个表格 UI。点击每行的“Edit”链接会使我们看到它们的值:
当点击了“Update”之后,GridView就会返回它们的值,通过EF模型层使它们存留着,最终在SQL CE数据库中保存。
了解更多关于ASP.NET Web Forms中的EF使用
请在http://asp.net网站上阅读这个教程系列了解更多关于怎样用ASP.NET Web Forms使用EF 。
教程中将SQL Express用作数据库–但欣慰的事情是所有相同的步骤/概念现在都可以用SQL CE完成。
演示2: 通过SQL CE和ASP.NET MVC 3使用EF代码优先
上面的案例我们使用了数据库优先的方法–此处我们先创建了数据库,然后用EF设计器从数据库中创建模型类。
除了支持基于设计器开发的数据流,EF也支持更多以代码为中心的选择,我们称之为 “代码优先开发”。代码优先开发形成了一个相当惹人喜欢的开发工作流。它使你可以:
· 通过需简单地编写“普通旧类”来定义你的模型对象,而不需要基类或可视化的设计器。
· 使用“配置约定”方法,从而不用明确地调试任何东西就能使数据库保持一致性
· 根据需要覆盖基于约定的暂留,使用一个流畅的代码API来完全地定制暂留映射
· 基于你定义的模型类根据需要自动创建数据库–允许你先从代码开始
过去我已经发表了几篇关于EF代码优先的博文–我真的觉得它很棒。好消息是它也可以和SQL CE一起很好地使用。
SQL CE, EF 代码优先和支持SQL CE的新VS 工具支持的组合形成了一个相当不错的工作流。下面是一个简单的例子,告诉你怎样使用它们创建一个简单的ASP.NET MVC 3工程。
第一步:创建一个新的ASP.NET MVC 3工程
我们将从Visual Studio中的文件->新项目菜单命令开始创建一个新的ASP.NET MVC 3工程。我们将使用“Internet Project”模板以使它有一个默认的皮肤实现:
第二步:用NuGet安装EFCodeFirst
接下来我们要用NuGet包管理器(ASP.NET MVC 3自动安装的)来把EFCodeFirst库添加到工程中。我们将用包管理器命令窗口来做这个。在Visual Studio中通过选择查看->其他窗口->包管理控制台 菜单命令打开包管理器控制台。然后在包管理器控制台中输入:
install-package EFCodeFirst
来下载EFCodeFirst库,把它添加到工程:
当我们输入了上面的命令,EFCodeFirst库就会被下载下来并添加到我们的应用程序中:
第三步:建立一些模型类
使用一个基于“代码优先”的开发工作流,我们会先创建模型类(甚至在我们创建数据库之前)。我们用写代码的方法来创建这些模型类。
对于这个案例,我们将在工程的“Models”文件夹上右击,向我们的工程添加下面的3个类:
上面的“Dinner” 和 “RSVP”模型类是“普通旧 CLR 对象” (又称为 POCO)。它们不需要由任何基类导出或实现任何接口,并且它们的属性都是标准的.NET数据类型。 它们上面没有添加数据暂留属性或数据代码。
“NerdDinners”类继承自DbContext(由EFCodeFirst提供),它处理从数据库中恢复/暂留Dinner 和RSVP实例。
第四步:Dinner列表
我们已经为这个工程写了对完成模型层所需要的所有代码。
现在让我们公开执行工程中的URL: /Dinners/Upcoming。我们将用它来罗列未来将要发生的Dinner。
我们将通过在“Controllers”文件夹上右击,选择“添加->控件”菜单命令来实现它。我们将指出我们想要的控制器来创建“DinnersController”。然后我们会在它里面实现一个“即将实现的”行为方法,它使用上面的模型层列出了即将到来的Dinner。我们将用一个LINQ查询来恢复数据,把它传递给一个视图,代码如下:
然后在方法上右击,选择“添加-视图”菜单命令来创建一个展示了Dinner的“将要实现的”视图模型。
我们将在“添加视图”对话框中使用“empty”模型选项,并用Razor写出下面的视图模板:
第四步:调试我们的工程以使用SQL CE数据库
我们已经完成了所有代码的编写–下一步将会是编译一个将要使用的数据库连接字符串。
通过把下面的<connectionString>添加到工程的顶部的web.config文件,我们将向SQL CE指出我们的NerdDinners模型类:
EF代码优先使用一个默认的约定,在这协议里上下文类会寻找一个与DbContext类名字匹配的连接字符串。由于之前我们创建了一个“NerdDinners”类,我们也把连接字符串命名为“NerdDinners”。 上面我们调试连接字符串以将SQL CE 用作数据库,并且告知它我们的数据库文件将会存在于ASP.NET工程的\App_Data目录中。
第五步:运行程序
既然我们已经创建了应用程序,那就来运行它吧!
我们将浏览/Dinners/Upcoming URL–这样做会显示一个空的列单:
你也许会问—列表从哪里查询来的?我们并没有明确地创建一个数据库?!?
EF代码优先支持的很酷的功能之一是在我们指出的数据库并不存在时自动地创建数据库的能力(取决于模型类的框架)。上面我们调试了EF代码优化使之在工程的\App_Data\目录下指向一个SQL CE数据库。当我们运行程序时,EF代码优先发现SQL CE数据库并不存在并自动地为我们创建一个。
第六步:使用VS2010 SP1来探究新创建的SQL CE数据库
在解决方案资源管理器中点击“显示所有文件”,你会看到“NerdDinners.sdf” SQL CE数据库文件,它是由\App_Data\文件夹里的EF代码优先为我们自动创建的:
我们可以选择在文件上右击,选“Include in Project"把它添加到我们的解决方案中:
我们也可以双击文件(不管它是否添加到了工程),VS 2010 SP1会把它作为一个我们可以在IDE的“服务资源管理器”内编辑的数据库来打开。当我们通过运行上面的应用程序进入了NerdDinners 类,它就会被EF代码优先执行:
我们可以在表格上右击,使用“Show Table Data”命令来往数据库中输入一些即将发生的Dinner:
我们将使用VS 2010 SP1支持的内置编辑器来填充下面的表格数据:
现在当我们在浏览器里的/Dinners/Upcoming URL上点击“refresh” ,我们就会看到一些将要有的Dinner显示出来:
第七步:更改我们的模型和数据库架构
现在让我们来修改模型层和数据库的架构,并演示一种使得这种做法更简单的新的针对SQLCE的VS 2010 SP1工具支持方法。
使用EF代码优先你可以从修改一个模型类来开始改变数据库。例如,我们添加一个附加的字符串属性“UrlLink”到我们的“Dinner”类。我们可以使用这个指向更多关于时间的链接:
现在当我们再次运行程序,并访问/Dinners/Upcoming URL我们将会看到抛出一个异常:
我们能看到这个错误是因为EF代码优先自动地创建数据库,且在默认情况下创建数据库后会添加一个表格,它帮忙追踪数据库架构是否和我们的模型类同步。当它们不同步时,EF代码优先会抛出一个错误—这使得在开发时期发现问题变得更容易,然而也许你只在运行时才会发现(通过含糊的错误)。注意如果你不想要这个功能,你可以通过改变DbContext类(在NerdDinners类中)默认的约定使它不再追踪schema version,把它关掉。
在上面的例子中我们的模型类和数据库架构是不同步的—我们怎么才能修复呢?现在你可以使用两种方法:
· 删掉数据库,使EF代码优先在一个新的模型类框架(在现有的DB中丢失了数据)的基础上自动地重建数据库
· 修改已有的数据库使它和模型类保持同步(保持/移植DB中现有的数据)
有两种方法可以用来做上面的第二种方法。下面我将演示怎样利用新的针对SQL CE的VS 2010 SP1工具支持来使用数据库架构工具修改我们的数据库结构。将来我们也打算用EF支持“迁移”功能,它将会允许你在程序上自动地/手写数据库架构迁移。
第八步:使用VS 2010 SP1修改我们的SQL CE数据库架构
VS 2010 SP1中的新的SQL CE工具支持使得修改我们已有的SQL CE数据库架构变得更容易。要做到这些,我们可以通过右击“Dinners”表格,选择“编辑表格架构”命令:
这将会产生下面的“编辑表格”对话框。我们可以重命名,修改或删除表格中任意一个已有的列,或在列的列标底部点击,手动添加一个新列。下面我已经添加了一个“nvarchar”类型(由于我们的属性是一个字符串)的“UrlLink”新列:
当点击了“ok”之后,数据库会自动更新产生一个新的列,现在我们的架构就和模型类相匹配了。
由于我们是手动地修改数据库架构的,所以我们要有一个附加的步骤来让EF代码优先知道数据库架构和模型类是同步的。正如我很早之前提过的,当EF代码优先自动地创建一个数据库时,同时也添加了一个“EdmMetadata”表格到数据库来追踪架构版本(把模型类弄乱来阻止它们发现模型类和数据库架构的不匹配):
由于我们是手动地更新和维护我们的数据库架构,我们不需要这个表格—所以可以删掉它:
这样我们仅剩下了下两个和模型类对应的表格:
现在当我们再次运行/Dinners/Upcoming URL,它将会正确地展示Dinner列表:
我们最后要做的一个润色将是更新视图来检查新的UrlLink属性,如果一个事件有UrlLink属性的话为它提供一个<a>链接:
现在当我们刷新/Dinners/Upcoming时,我们将会看到数据库中存储UrlLink的事件有超链接:
总结:
SQL CE提供了一个免费的,嵌入式的数据库引擎,易于你使用数据库存储。有了SQL CE4,你可以在ASP.NET工程和应用程序(Web Forms 和 MVC)中使用它。
VS 2010 SP1提供的工具支持使你可以简单地创建,编辑和修改SQL CE数据库—也可以使用标准的EF设计器。这使你在利用嵌入式的数据库选项的同时重温你已掌握的技术和数据知识。这对小的应用程序(你不需要完全的SQL Server的可扩展性)和开发测试案例—你想不用全局的数据库案例快速地开发/测试你的应用程序。
SQL CE使得后期迁移你的数据到一个完整的SQL Server或SQLAzure实例变得容易——如果你想的话——不用改变应用程序中的任何代码。在上面的两个场景中我们需要改变的只是web.config文件中的<connectionString>值,以使代码在SQL Server上运行。这为从小的嵌入式数据库解决方案基础上扩展的应用程序提供了很大的灵活性。
希望这些对您有所帮助。
Scott
附:除了发表博客,我现在也使用Twitter来快速更新并分享链接。请关注我:twitter.com/scottgu