在本篇文章中,我们学习如何使用实体框架的“Code First Migrations ”(也称为代码先行功能)工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构。

默认情况下,当您使用实体框架的“Code First Migrations ”工具,实体框架会自动创建一个数据库。“代码先行功能”首先会添加一个新表到数据库中,以便跟踪数据库的架构是否与模型类同步。如果它们不同步,实体框架会抛出一个错误。这样开发人员在开发时就能更容易地追查问题出在什么地方,而其他的开发方式就只能在运行时通过模糊的错误信息查找什么地方出错了。

一、设置代码优先迁移的模型更改

如果您使用的是Visual Studio 2012,从解决方案资源管理器中双击Test.mdf文件,会打开数据库管理工具。其中Visual Studio Express For Web版本的VS将显示数据库资源管理器,Visual Studio 2012其他版本会显示服务器资源管理器。如果您使用的是Visual Studio 2010中,使用SQL Server对象资源管理器。 
         1)在服务器资源管理器中—》“数据连接”中(数据库管理工具、数据库浏览器、服务器资源管理器或SQL Server对象资源管理器),右键单击developer\sqlexpress.Test.dbo,然后选择删除。如下图1、图2。图1是删除连接,图2是删除数据库。

图1

图2

2)执行菜单--》工具--》生成--》生成解决方案,以确保没有错误。 
       3)从菜单--》工具菜单中,单击库程序包管理器--》程序包管理器控制台。如下图。

4)在Visual Studio的下方窗体中的“程序包管理器控制台”窗口的“>”提示符下输入“Enable-Migrations -ContextTypeName MvcApplication1.Models.BookDBContext”。如下图。

5)在执行完Enable-Migrations命令之后(如上图所示),会在项目中创建一个新的文件夹“Migrations”, 在这个文件夹中创建一个Configuration.cs文件。如下图。

6)在Visual Studio中打开Configuration.cs文件。用下面的代码替换Configuration.cs文件的Send方法:

namespace MvcApplication1.Migrations

{

    using System;

    using System.Data.Entity;

    using System.Data.Entity.Migrations;

    using System.Linq;

    using MvcApplication1.Models;

    internal sealed class Configuration : DbMigrationsConfiguration<MvcApplication1.Models.BookDBContext>

    {

        public Configuration()

        {

            AutomaticMigrationsEnabled = false;

        }

        protected override void Seed(MvcApplication1.Models.BookDBContext context)

        {

            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 

            //  to avoid creating duplicate seed data. E.g.

            //

            //    context.People.AddOrUpdate(

            //      p => p.FullName,

            //      new Person { FullName = "Andrew Peters" },

            //      new Person { FullName = "Brice Lambson" },

            //      new Person { FullName = "Rowan Miller" }

            //    );

            //

            context.Books.AddOrUpdate(i => i.BookID,

        new Book

        {

            Name = "When Harry Met Sally",

            PublishDate = DateTime.Parse("1989-1-11"),

            Category = "MS",

            AuthorID=1,

            Numberofcopies=12,

            Price = 7.99M

        },

         new Book

         {

             Name = "Ghostbusters ",

             PublishDate = DateTime.Parse("1984-3-13"),

              Category = "MS",

            AuthorID=1,

            Numberofcopies=112,

             Price = 8.99M

         },

         new Book

         {

             Name = "DB 2",

             PublishDate = DateTime.Parse("1986-2-23"),

               Category = "IBM",

            AuthorID=1,

            Numberofcopies=22,

             Price = 9.99M,

         }

   );
} } }

7)使用鼠标右键单击Book下的红色波浪线,在弹出菜单中选择“解析”菜单项,然后在弹出菜单中选择“MvcApplication1.Models”;如下图。

在经过这样做了之后,Visual Studio会自动在代码中增加using语句如下:

using MvcApplication1.Models;

在“程序包管理器控制台”窗口中执行了“Code First Migrations ”功能中的“迁移”命名之后,代码会自动调用Send 方法(即程序包管理器控制台会调用此方法更新数据库中的数据),并且执行该方法时如果代码中的对象数据不存在则插入,如果存在则进行更新。

二、迁移数据库
       1) 如果此时在Visual Studio中按Ctrl-Shift-B(或者菜单-->生成-->生成解决方案)来编译项目,将会出现编译不了的错误。如下图。 
       2) 接下来要建立一个DbMigration类来进行初始迁移。使用这个迁移命名创建一个新的数据库,这就是为什么我在上一步中删除了Test.mdf文件。 
       3) 在程序包管理器控制台窗口中,输入命令“dd-migration Initial”创建初始迁移。其中“Initial”的命名是任意的,是用来命名新创建的迁移文件。如下图。

4)“Code First Migrations ”功能中的“迁移”命名会在迁移文件夹中的创建一个新的类文件(名为{DATESTAMP}_Initial.cs),而且这个类中已经包含了创建数据库架构的代码。迁移文件名的命名规则中有一个固定的时间戳,用以帮助排序。检查{DATESTAMP}_Initial.cs文件,它包含了创建Books表的数据库的说明。这个{DATESTAMP}_Initial.cs文件将运行并创建数据库架构。然后运行Send方法为数据库填充测试数据。 
           5) 在程序包管理器控制台,输入命令“update-database”来创建数据库,并执行Send方法。如下图1,图2。

图1

图2

如果你得到一个错误,指示表已经存在,不能被创建,它可能是因为你正在运行应用程序,在你删除了数据库之后,执行更新数据库之前。(如上图1)。

在这种情况下,再次删除Test.mdf文件,然后重试“update-database”命令。如上图2。如果仍然出现错误,请删除该文件夹和内容,然后开始在这个页面的顶部(也就是删除Test.mdf文件然后进行启用,迁移)的说明。 
          6) 按F5运行应用程序,在浏览器中浏览Books/Index网址。会显示Send方法中填充到数据库中的数据。如下图。

“Code First Migrations ”工具【转】的更多相关文章

  1. 学习ASP.NET MVC(九)——“Code First Migrations ”工具使用示例

    在上一篇文章中,我们学习了如何使用实体框架的“Code First Migrations ”工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 在本文章中,我们将使用“ ...

  2. 学习ASP.NET MVC(八)——“Code First Migrations ”工具

    在本篇文章中,我们学习如何使用实体框架的“Code First Migrations ”(也称为代码先行功能)工具,使用其中的“迁移”功能对模型类进行一些修改,同时同步更新对应数据库的表结构. 默认情 ...

  3. EF Code First Migrations数据库迁移

    1.EF Code First创建数据库 新建控制台应用程序Portal,通过程序包管理器控制台添加EntityFramework. 在程序包管理器控制台中执行以下语句,安装EntityFramewo ...

  4. Code First Migrations 数据迁移小记

    用了codefirst后一个很大的问题就是代码中的属性字段与数据库中表的同步问题,删掉数据库重新生成当然可以解决,不过数据就丢失了(当然通过代码中初始化数据库添加数据也可以解决,初始化的任务可以通过重 ...

  5. 15个最佳的代码评审(Code Review)工具

    代码评审可以被看作是计算机源代码的测试,它的目的是查找和修复引入到开发阶段的应用程序的错误,提高软件的整体素质和开发者的技能.代码审查程序以各种形式,如结对编程,代码抽查等.在这个列表中,我们编制了1 ...

  6. Code First Migrations: Making __MigrationHistory not a system table

    https://blog.oneunicorn.com/2012/02/27/code-first-migrations-making-__migrationhistory-not-a-system- ...

  7. Model backing a DB Context has changed; Consider Code First Migrations

    Model增加一个字段,数据库对应的也手动添加了字段但是运行时报错 The model backing the 'TopLogDbContext' context has changed since ...

  8. Code First Migrations更新数据库结构的具体步骤

    一.打开程序包管理器控制台 当你的实体模型与数据库架构不一致时,引发以下错误:The model backingthe 'SchoolContext' context has changed sinc ...

  9. ASP.NET MVC 学习6、学习使用Code First Migrations功能,把Model的更新同步到DB中

     参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-th ...

随机推荐

  1. 函数名: lseek

    函数名: lseek 功 能: 移动文件读/写指针 头文件:#include <sys/types.h> #include <unistd.h> 用 法: off_t lsee ...

  2. sublime text3 英文版转为中文版

    第一步设置好:https://packagecontrol.io/installation#st3 简单几步 : 1. 点击菜单栏中“preferences”,弹出选项中找到“package cont ...

  3. 牛客练习赛20(ABC)

    A. 礼物 题意: 我从买奥利奥的事情中想出了一个算法题:假设某个店铺有N种不同类型的1元奥利奥和M种不同类型的2元奥利奥,而且余量无限,我的钱有k元,我想把k元都用来买奥利奥,且可以买同类型的奥利奥 ...

  4. 访问XML文件中的信息

  5. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(五) 补充:历史记录 和 消息提醒

    有开发者提问怎么做历史记录功能和即使不打开聊天窗口有消息提醒功能.简单抽时间写了点代码.不过只是基本思路,具体细节没有实现. 正如前几篇博客中提到的,读取历史记录什么时候读取呢?按照常理,应该是打开聊 ...

  6. Hibernate注解开发示例

    -------------------------------------------------------------------customer------------------------- ...

  7. R 代码积累

    R 代码积累不定期更新 1.阶乘.递归.reduce.sprintf #NO.1 # 阶乘函数 fact <- function(n){ if(n==0) return(1) #基例在这 els ...

  8. SpringMVC学习记录五——功能开发及参数处理

    15       包装类型pojo参数绑定 15.1      需求 商品查询controller方法中实现商品查询条件传入. 15.2      实现方法 第一种方法:在形参中 添加HttpServ ...

  9. Javascript中==和===的区别

     一.JavaScript"=="的作用 1.当==两边的内容是字符串时,则比较字符串的内容是否相等. 2.当==两边的内容是数字时,则比较数字的大小是否相等. 3.当==两边的内 ...

  10. pv与单广告位曝光统计优化

    上一篇文章<巧用域名发散,缓解单广告位并发请求限制>中提到了我已经将广告的数据请求写成了单广告位请求.既然数据请求都已经是单广告位的了,那么曝光统计也理所应当是单广告位的. pv是什么? ...