分类: 数据库 设计模式 c#2013-04-24 17:56 137人阅读 评论(0) 收藏 举报

工程用的MVC + Entity Framework,根据CodeFirst的编程理念,先创建模型再自动生产数据库和数据表。

看起来这很方便,也给开发带来很多便利,开发时不用考虑数据建库建表。

所以首先建立框架,写好实体和DbContext

当地我们运行程序的时候,程序会根据我们的数据库配置文件生成对应的数据库表和字段

非常方便。

问题来了

一、当我们的程序开发到中途时,发现还需要一个字段。好,按照常理,就在对应的实体加一个属性就是了,但当我们加入实体的时候,再次运行程序就报错了。

有个最笨但简单的方法,删除数据库,再次运行程序。OK,问题接着又来了。

二、当我们的程序试运行一段时间后,需要增加一个字段。怎么办呢?还是按照常理来,在对应的实体加一个属性,OK。接下来我们可能会想到

1、方案一:再次删掉数据库,重新运行程序。可是我们的数据都丢失了,可以发现表是重建了,数据都丢失了。不科学。

2、方案二:直接在数据库对应的表里面加上我们在实体里面命名的属性字段,并且选择对应的数据类型,好,想象中是可以的,而且运行没有报错,但实际会令我们失望。运行程序,程序仍然将我们的表重建,数据丢失。为什么我们手动把数据表字段与实体字段设置成一致了还会出错呢?这个我也没有深究。可能是EF框架另有玄机吧,望有高手指点。

3、方案三:首先备份现有表里面的数据,再删除数据库,运行我们的程序,新的表和字段都建好了,然后我们再想办法不论是写sql插入还是怎么办,反正很麻烦。而且如果遇到有自增主键关联的,你还没办法插对应主键的记录。所以仍不可行。

解决方法

其实微软早就有很好很完美的解决办法了。通过网上搜集到的资料,简单说明其操作方法

涉及到变更表结构和字段的,都可以用数据迁移的方法。

具体操作如下:

1、首先修改我们的实体。编译通过。

2、打开“程序包管理器控制台”

3、打开之后如下图所示,选中我们的Domain程序集

4、输入“Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext”命令。别急,你得把MvcMovie.Models.MovieDBContext改成你的工程对应正确的类名,如下图

5、命令执行之后,我们会发现我们的程序集里多了一些文件夹和文件。这个是自动生成的。

6、执行命令“add-migration Initial”,其中“Initial”可以自定成其他名字。

7、执行命令“update-database”,成功执行。

8、运行我们的程序,我们会惊奇地发现,我们的表结构已经修改了,而且我们的数据也都还在。

进一步

问题已经解决了,我们再来深入一下这种迁移方式。

一、当我们增加列(增加实体字段)时,可以不必重复上面的所有操作。

1、只需要将\Migrations\Configuration.cs文件中的AutomaticMigrationsEnabled = false;改成true

     

2、然后程序包管理器控制台执行“update-database”,成功后,在启动运行程序,我们就完成删除列的操作了,很简单吧。

二、当我们删除列(删除实体字段)时,同样使用上面的操作,没有成功,报会丢失数据,所以不能简单地执行“update-database”就能完成。

1、执行命令“add-migration Initial”。

2、执行命令“update database”。

3、运行程序,更新完毕。

三、这些都是简单的增删操作,利用这种方式能进行很多修改结构的操作而不影响数据。但有些操作利用这种方法仍然不能实现,比如说修改数据的类型,如从字符串改成数值类型等。根据实际情况用不同的方式方法来解决。

CodeFirst解决数据迁移问题的更多相关文章

  1. CodeFirst进行数据迁移之添加字段

    一.为模型更改设置 Code First 数据迁移 1.工具->库程序包管理器->程序包管理器控制台->输入"Enable-Migrations"  或者 Ena ...

  2. MVC5+EF6+MYSQl,使用codeFirst的数据迁移

    之前本人在用MVC4+EF5+MYSQL搭建自己的博客.地址:www.seesharply.com;遇到一个问题,就是采用ef的codefirst模式来编写程序,我们一般会在程序开发初期直接在glob ...

  3. 实现CodeFirst自动数据迁移无需命令

    本主题假设您掌握了实体框架中 Code First 迁移的基本知识. 借助自动迁移功能,您无需对您所做的每一个更改都在程序包管理器控制台中运行Update-Database 命令. 启用迁移 只需执行 ...

  4. 实现CodeFirst自动数据迁移无需手动执行命令

    本主题假设您掌握了实体框架中 Code First 迁移的基本知识. 借助自动迁移功能,您无需对您所做的每一个更改都在程序包管理器控制台中手动Update-Database . 启用迁移 只需执行一次 ...

  5. EF架构~CodeFirst数据迁移与防数据库删除

    回到目录 本文介绍两个概念,防数据库自动删除,这是由于在code first模式下,当数据实体发生变化时,会对原来数据库进行删除,并将新数据表添加进来,但这对于我们的运营环境数据库,是万万不能接受的, ...

  6. 20.1翻译系列:EF 6中自动数据迁移技术【EF 6 Code-First系列】

    原文链接:https://www.entityframeworktutorial.net/code-first/automated-migration-in-code-first.aspx EF 6 ...

  7. Entity Framework CodeFirst数据迁移

    前言 紧接着前面一篇博文Entity Framework CodeFirst尝试. 我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual ...

  8. codefirst数据迁移技术,在保留数据库数据下实现对模型的修改并映射到数据库

    一前言 这是我的处女作,写的不好的地方还望指出共同讨论.EF的数据访问方式有三种DbFirst,ModelFirst,还有本文要提到的CodeFirst 三者都是以ORM的方式建立.本人之前学习的.n ...

  9. 图文详解 解决 MVC4 Code First 数据迁移

    在使用Code first生成数据库后 当数据库发生更改时 运行程序就会出现数据已更改的问题  这时可以删除数据库重新生成解决 但是之前的数据就无法保留  为了保留之前的数据库数据  我们需要使用到C ...

随机推荐

  1. php学习之路

    1.php拼接字符串+查询 $floor_id = M('house_floor_input')->where($map1)->field('id')->select(); $flo ...

  2. SpringMVC——从HelloWorld

    学习SpringMVC——从HelloWorld开始   前言: 时隔十二年,中国女排最终过关斩将,用3:1的成绩证明了自己的实力,霸气夺冠,为中国赢得了一枚意义非常的金牌.这是一次全民的狂欢,一场视 ...

  3. Solr Update备注

    参考资料: http://wiki.apache.org/solr/ExtractingRequestHandler#Sending_documents_to_Solr /update 标准的upda ...

  4. Mssql显错和不显错模式下的注入

    Title:Mssql显错和不显错模式下的注入 -- 2010-10-27 19:51 近期用手工注入用习惯了,便列出最近用的Mssql语句,以后方便拿来用! -------------------- ...

  5. Android的两种菜单

    Android子菜单和选项菜单与上下文菜单的实现 菜单在Android开发中必不可少,可是要怎么实现各种菜单呢?是不是很头疼呢?下面我就来介绍一下: 1. 选项菜单和子菜单的实现 选项菜单:最常规的菜 ...

  6. 关于 "Context" 模式(基于COM思想IUnknown思想)

    有同事很喜欢用Context模式,觉得是自己"首创", 我有些自己的想法, 或者大家可以发表下自己的观点.   什么是Context模式? 23种设计模式中没有这个模式, 是同事自 ...

  7. 使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework

    在Xamain 未被收购之前,这货monodroid.exe  就是一个打包的绑定...无奈 配置环境复杂,未能实现 ...有mono运行时就行了..不折腾了 玛德 让C#程序独立运行(脱离 .NET ...

  8. 用Setup系列函数完成驱动卸载安装[驱动安装卸载程序]

    // InstallWDFDriver.cpp : Defines the entry point for the console application. // #include "std ...

  9. Android双击返回键退出Activity的两种方法

    在开发应用程序的时候,有一种功能是非常常用到的,那就是迅速双击返回按钮,然后实现退出Activity的功能.本人在网上看了很多资料代码,总结起来,主要有两种比较好的方式.一种是开线程延时执行,一种是记 ...

  10. json与jsonp ajax

    今天在网上找了一下资料,发现这篇文章总结得好,果断转了:http://blog.csdn.net/superhosts/article/details/9057301