代码改变世界

EntityFramework5.0 数据迁移笔记--解决模型变化重建数据库的问题

2013-06-04 17:29 stoneniqiu 阅读(...) 评论(...) 编辑 收藏

       用了Codefirst后最大的困扰就是数据变化引起数据库的删除再新建,这样会造成数据丢失,musicstore中介绍的播种办法也只能满足下测试的需要。在EntityFrameWork5.0中引入了数据迁移功能能很好的解决这个问题。

       步骤一:

需要EF5.0,最好用NuGet来安装。工具-->库程序包管理器-->程序包管理控制台(我用的VS2012)

 

   输入命令,安装最新的ef。如下

  

  输入get-help NuGet 可以查看其它的命令

主题
    about_NuGet
    
简短描述
提供有关 NuGet 程序包管理器命令的信息。
           
详细描述
本主题介绍 NuGet 程序包管理器命令。NuGet 是集成的程序包
管理工具,用于将库和工具添加到 .NET 项目。

                 
包括了以下 NuGet cmdlets。

Cmdlet                    描述
        ------------------        ----------------------------------------------
Get-Package                获取程序包源中可用的程序包集。

Install-Package                在项目中安装程序包及其依赖项。

Uninstall-Package            卸载程序包。如果其他程序包依赖于此程序包,
                    则该命令将会失败,除非指定了 -Force 选项。

Update-Package                将程序包及其依赖项更新为较新版本。

Add-BindingRedirect            检查项目输出路径中的所有程序集,
                    并根据需要将绑定重定向添加到
                    应用程序(或 Web)配置文件。
                            
Get-Project                为指定的项目返回对 DTE (Development Tools Environment) 
                    的引用。如果未指定任何项目,则返回
                    程序包管理器控制台中选择的默认项目。

Open-PackagePage        打开浏览器,并指向指定的程序包的 ProjectUrl, LicenseUrl 或
ReportAbuseUrl。

        Register-TabExpansion    为命令的参数注册选项卡扩展。

另请参阅
联机文档: http://go.microsoft.com/fwlink/?LinkID=206619
    Get-Package
    Install-Package
    Uninstall-Package
    Update-Package
    Add-BindingRedirect
    Get-Project
    Open-PackagePage
    Register-TabExpansion
View Code

 步骤二:

 允许数据迁移,继续输入命令:PM> enable-migrations   会自动生成migration配置文件类,在构造函数中加入黄色mark的部分,允许自动迁移。比如你Model里面修改了字段类型,长度,或者增加了字段。它来自动修改数据库。但这还没有结束

namespace NoteSystem.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration<TContext> : DbMigrationsConfiguration<TContext> where TContext:DbContext
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
            AutomaticMigrationDataLossAllowed = true;
        }

       
    }
}

 步骤三:修改数据库的构造函数,我的数据库这里是NoteDb ,灰色部分我们之前用的方式,很不好,黄色部分就是支持数据迁移初始化。

  public NoteDb()
            : base(DbNameOrDbConnectionstring)
        {
            Database.SetInitializer(new MigrateDatabaseToLatestVersion<NoteDb, Configuration<NoteDb>>());
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<NoteDb>()); }

 总结:这个migration还是省了不少事情,但也不是那么的完全智能,最好不要手动去删除数据库中的表,通过dbset来删除,因为数据库所有的操作记录是记录在数据库中,在系统表的MigrationHistory 中。 你的手动记录是没有存在这里面的。