分类: 数据库 设计模式 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. MySQL查询优化处理

    查询的生命周期的下一步是将一个sql转化成一个执行计划,MySQL再依照这个执行计划和存储引擎进行交互.这包括多个子阶段:解析sql,预处理,优化sql执行计划.这个过程中任何错误(例如语法错误)都可 ...

  2. MVC模式下xml文件的解析

    第一次写blog,组织不当和出错的地方还请大家多担当哈. java操作xml文件的方式中用的较多的有四种,DOM.SAX.JDOM.DOM4J.除第一种外其余的三种我都有试过,这后三种方案中我选择用S ...

  3. apache配置多站点

    在httpd.conf文件中,有如下配置(注:舍去httpd.conf文件的注释内容) Listen 80 ServerName localhost <Directory /> Allow ...

  4. django初探

    如果是自己建站耍的话,还是用Php方便,毕竟Php服务器便宜又到处都是. 但是python毕竟是一个新鲜的东西,特别是django,以前一直东python的语法,而且是我最早学习的语言之一,但是一直停 ...

  5. python常用数据结构的常用操作

    作为基础练习吧.列表LIST,元组TUPLE,集合SET,字符串STRING等等,显示,增删,合并... #===========List===================== shoplist ...

  6. 在keil中使用printf()函数的要点

    在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下: 1.printf函数是调用pu ...

  7. 最全的TV视频应用合集,包含50多款客户端,有丰富直播点播

    这是我目前找到的 最好的视频应用合集,与坛友分享下.有50多款视频客户端,基本覆盖目前市面上口碑比较好的视频应用了. 里面有丰富的直播客户端,像 龙龙直播.泰捷直播.果子 Tv.More Tv等,还有 ...

  8. #翻译# 深入JavaScript的Unicode难题(上)

    退一步说, JavaScript处理Unicode时有些怪异. 这篇文章会说明JS在Unicode上令人痛苦的部分, 然后提供解决方案, 并说明在未来的ECMAScript6中是如何改善这些问题的. ...

  9. JDBC连接mysql编程

    基本操作 package jdbc; import java.sql.Statement; import java.util.Scanner; import java.sql.Connection; ...

  10. java socket报文通信(一) socket的建立

    TCP是Transfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议.通过TCP协议传输,得到的是一个顺序的无差错的数据流.发送方和接收方的成对的两个socket之间 ...