MVC:Code First Migrations

Come from old posts in MVC:Code First Migrations , 2016-08-01

有必要先来了解一下什么叫做CodeFirstMigrations(代码先行的迁移 ):

应用程序开发领域中的代码先行(Code First)方法指的是先在代码中创建对象模型,然后按照模型生成数据库结构。这与“模型先行开发”类似,那种方式会使用Visual Studio中的EF设计器创建数据模型。Code First Migrations这种工具可以基于代码中所做的改变,以递增的方式更新已存的数据库结构。这可以按照自动或者手动的方式进行,采用哪种方式依赖于对模型所做出的更新的类型。能够自动完成的变更类型有:

  • 增加属性或者类
  • 对属性和类重命名(想要使其正常工作,需要编写一些脚本)
  • 对列(column)或者表(table)重命名,而不对属性或类重命名
  • 删除属性

在任何一种情况下,执行命令Update-Database就会自动把变更应用到数据库结构上。

对于所有其它更新,Code First Migrations会使用Add-Migration命令创建变更数据库的脚本。这些迁移操作都会保存,并加上时间戳,让我们可以回滚到数据库结构的上一个版本。除了能够对数据库结构做出变更之外,迁移操作中还可以包括用于操作数据的SQL命令。想要提交迁移操作,你只需要再次运行Update-Database命令。为了对数据库进行复制,Code First Migrations也可以使用Update-Database来创建SQL脚本:

Update-Database –TargetDatabase:"NewDatabase" –Script

1)CodeFirstMigrations

执行CodeFirstMigrations 代码先行的迁移 ,我们需要这么做:

1.打开数据迁移功能(Enable Code First Migrations)

Nuget管理器->程序包管理控制台:

Enable-Migrations -ContextTypeName MVCTest001.Models.DBContext
正在检查上下文的目标是否为现有数据库...
已为项目 MVCTest001 启用 Code First 迁移。

这里需要注意,针对旧blog没有提及的问题说明,当Context上下文不在MVC主项目中的时候,需要改变指令的语法如下:

PM> Enable-Migrations -ProjectName MVCTest001.CoreProjectXXX.Models
正在检查上下文的目标是否为现有数据库...
已为项目 MVCTest001 启用 Code First 迁移。
PM>

开启数据迁移设置完成,后续的操作都按照上述的规则来处理

2.如果尝试再次进行迁移设置指令,就会得到这样的反馈:

PM> Enable-Migrations -ContextTypeName MVCTest001.Models.DBContext
已在项目“MVCTest001”中启用迁移。若要覆盖现有迁移配置,请使用 -Force 参数。

可以发现,指令不被允许,因为迁移已经开启

3.初始化数据迁移基架,并建立时间节点

PM> add-migration Initial
正在为迁移“Initial”搭建基架。
此迁移文件的设计器代码包含当前 Code First 模型的快照。
在下一次搭建迁移基架时,将使用此快照计算对模型的更改。
如果对要包含在此迁移中的模型进行其他更改,
则您可通过再次运行“Add-Migration Initial”重新搭建基架。
PM>

提示迁移完成,并按时间创立了新类,并包含了创建数据库架构的代码

4.进行数据库架构刷新,并运行Seed方法

PM> update-database
指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。
正在应用显式迁移: [201607311640461_Initial]。
正在应用显式迁移: 201607311640461_Initial。
正在运行 Seed 方法。
PM>

迁移结束,数据库架构初始化完成

2)为数据表增加条目

1.在实体类中添加新的属性(条目)

2.在View中进行所有必要的修改,在后台同样

以添加Rating为例,比如:

public ActionResult Create([Bind(Include = "ID,Title,ReleaseDate,Genre,Price,Rating")] PersonalModel personalModel) {
......

当然可能不止一处,需要全部增补完毕

在前台部分:

<td>
            <!-- ...... -->
</td>
        <td>
            @Html.DisplayFor(modelItem => item.Rating)
        </td>

以及所有需要增补的地方

3.这时候编译运行会报错

先看两个错误,(1):

自创建数据库,支持 ‘MovieDBContext’ 上下文模型已更改。考虑使用代码第一次迁移来更新数据库 (http://go.microsoft.com/fwlink/?LinkId=238269)。

(2):

Server error in “/” application ,the model backing the “……” context has changed since the database was created……

4.解决方案

因为数据库架构和实体类已经不同,这里我们通过数据库迁移的方法来解决

首先在Seed中添加你增补的条目,比如“Rating”,每一个单元都要增补

然后记得生成解决方案

接着在Nuget管理器->程序包管理控制台的输入和输出:

PM> add-migration Rating
正在为迁移“Rating”搭建基架。
此迁移文件的设计器代码包含当前 Code First 模型的快照。
在下一次搭建迁移基架时,将使用此快照计算对模型的更改。
如果对要包含在此迁移中的模型进行其他更改,
则您可通过再次运行“Add-Migration Rating”重新搭建基架。

这里要注意,“add-migration ******”的命名是随意的,处于可读性考虑,建议要像GitHub一样为commit的命名一样来处理

这样数据库就在基架框架中更新了条目,然后只要update数据库框架:

PM> update-database
指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。
正在应用显式迁移: [201608010340559_Rating]。
正在应用显式迁移: 201608010340559_Rating。
正在运行 Seed 方法。
PM>

这样数据库刷新完成,打开网页就能正常运行了,功能当然也正常

130 thoughts on “MVC:Code First Migrations”

  1. I drop a leave a response when I especially enjoy a article on a site or I have something to contribute to the discussion. It’s caused by the sincerness communicated in the article I
    browsed. And after this article MVC:Code First Migrations – Wallace Sun. I was moved
    enough to post a comment 🙂 I actually do have a
    few questions for you if you do not mind. Could it be only me or do some of the responses come across like they are left
    by brain dead folks? 😛 And, if you are posting on additional online social sites, I’d like to follow anything new you have to post.
    Would you make a list all of your communal sites like your twitter feed, Facebook page
    or linkedin profile?

  2. Sick and tired of being bored? There’s nothing at all good to watch on TV these days. How many cat videos can you watch at YouTube? What you really want is some live adult entertainment. That’s what http://www.camgirl.pw is all about. It’s 24/7 excitement like you’ve never seen before. Check it out and tell a friend. Something this good needs to be shared.

  3. Thanks for the marvelous posting! I seriously enjoyed reading it, you
    will be a great author. I will make sure to bookmark your blog and may come
    back later in life. I want to encourage one to
    continue your great job, have a nice day!

  4. Hey there! Would you mind if I shae your blo with my zynga
    group? There’s a lott of people that I think would really appreciate
    your content. Please let me know. Cheers

  5. Greetings! This is my first visit to your blog! We are
    a group of volunteers and starting a new initiative in a community in the same niche.
    Your blog provided us valuable information to work on. You have done a outstanding job!

  6. Wonnderful beat ! I would like tto apprntice while you amend your site, how ould i
    subscribe for a blog site? The account helped me a acceptable deal.
    I had been tiny bit acquaintdd oof this your broadcast offered bright clear
    concept

  7. Hello there friend! Oh my goodness! an amazing article dude. Thank you However I am experiencing issue with ur rss . Don?t know why Unable to subscribe to it. Is there anyone getting identical rss problem? Anyone who knows kindly respond. Thnkx Again thanks alot for this!

Leave a Reply

Your email address will not be published. Required fields are marked *