分类: 数据库 设计模式 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. Covariant Returen Types(协变返回类型)

    基类virtual func返回类型为某个类(class Super)的ptr或ref,子类重写的virtual func返回类型可改为该类子类(class Sub : public Super)的p ...

  2. CSS的力量

    CSS(Cascading Style Sheet)级联样式表,是一种美观网页设计的解决方案,也是W3C推荐的标准,他可以是我们的网页设计更灵活,更美观,使设计人员对内容的设计和样式的设计分离,使设计 ...

  3. protocol buffer介绍(protobuf)

    一.理论概述0.参考资料入门资料:https://developers.google.com/protocol-buffers/docs/javatutorial更详细的资料:For more det ...

  4. PHP获取指定年份指定月份的天数

    最近写接口的时候突然发现的非常实用的php函数,在这儿分享一下: cal_days_in_month(calender,$month,$year): calender:历法,常量,如CAL_GREGO ...

  5. Delphi的IDHTTP的基本用法

    一.IDHTTP的基本用法 IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快.更节约资源,缺点是需要手动维护cook,连接等 IDHttp的创建,需要引入ID ...

  6. OpenStack点滴02-WSGI

    OpenStack对外提供REST API,那么REST API是如何建立起来的呢? OpenStack用了一种叫WSGI(Web Service Gateway Interface)的东西,WSGI ...

  7. 怎么用visual studio2010编写c++程序|用visual studio2010编写c++程序的步骤

    如何通过visual studio 2010编写一个简单的c++程序,随小编不一起看看如何编写. 首先打开visual studio 2010 点击软件左上角“文件-新建-项目”,选择“win32-w ...

  8. 用MySQL创建数据库和数据库表

    1.使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; +----------+ | Database | +----------+ | mysql ...

  9. 注意:rsyslog 源码安装 会出现日志重复发的情况,需要rpm包安装

    cd /etc/yum.repos.d;wget http://rpms.adiscon.com/v8-stable/rsyslog.repo uat-web02:/etc/yum.repos.d# ...

  10. RenderBody, RenderPage and RenderSection methods in MVC 3

    原文地址:http://www.codeproject.com/Articles/383145/RenderBody-RenderPage-and-RenderSection-methods-in R ...