Entity Framework CodeFirst数据迁移

原文:Entity Framework CodeFirst数据迁移

前言

紧接着前面一篇博文Entity Framework CodeFirst尝试

我们知道无论是“Database First”还是“Model First”当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Code First如何更新已有的模型呢?今天我们简单介绍一下Entity Framework的数据迁移功能。

Entity Framework配置

 当我们对项目进行Entity Framework进行安装引用的时候,同时生成了两个配置文件

packages.config文件:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net45" />
</packages>

 App.config文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

 packages.config内容比较简单,首先是EF自身版本,然后在安装过程中根据当前应用的.NET Framework版本配置了“targetFramework”,因为不同的.NET Framework版本对应的EF程序集不同,这在安装过程中会自动识别并配置。

App.config中自动添加了“entityFramework”配置节,在EF包安装过程中自动根据当前环境配置了“defaultConnectionFactory”, “defaultConnectionFactory”是EF默认的连接配置,只有在没有配置连接字符串时生效。

 配置了数据库链接字符串的App.config配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="CodeFirstTest" connectionString="Data Source=.;Database=CodeFirstTest;UID=sa;PWD=sa123;" providerName="System.Data.SqlClient"></add>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="v11.0" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

CodeFirst 数据迁移

现在让我们在上一篇文章的Entity Framework CodeFirst尝试 的基础上给Order添加一个"Employee”属性,然后运行,不出意外的话你将看到如下异常:

 

 从异常信息我们可以看出,EF已经检测到模型发生了改变,建议我们使用”Code First Migrations”对模型进行更新。

在开始Code First数据库迁移之前,我们先对上一节编写的OrderTestContext类进行修改添加默认构造函数,因为Code First Migrations将会使用数据库上下文的默认构造函数进行数据迁移操作(尽管没有默认构造函数所有的数据操作都能正常进行,但是对于数据迁移这是必须的),因此我们需要添加一个默认构造函数,并且该构造函数中必须传入我们的数据库连接名称,否则将会把更新应用到EF默认数据库上。下面是我们的OrderTestContext:

    public class OrderTestContext:DbContext
    {
        public OrderTestContext():base("CodeFirstTest")
        { 

        }

        public OrderTestContext(string connectionName)
            : base(connectionName)
        {
        }
        public DbSet<Order> Orders { get;set;}

        public DbSet<OrderDetail> OrderDetails { get; set; }
    }

 

下面我们将借助于”Code First Magrations” 进行模型更新。然后找到如下图所示的位置

1.在“程序包管理器控制台”键入命令:Enable-Migrations -ProjectName  CodeFirstTest

 

如果多次执行此命令可以添加-Force参数

 

添加后,项目中添加了一个名为Migrations的文件夹

 

查看Configuration文件中的代码为:

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

    internal sealed class Configuration : DbMigrationsConfiguration<CodeFirstTest.OrderTestContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(CodeFirstTest.OrderTestContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}

 方法Seed中可以进行数据迁移后的数据初始化工作,将在每次迁移之后运行。如上代码所示,AddOrUpdate是IDbSet<TEntity>的扩展方法,如果指定条件的数据不存在,则会添加,如果存在,会更新。所以,如果数据是通过此方法来初始化的,在与业务更新之后,再次进行数据迁移后,还是会被还原。

还有一个名为InitialCreate的类,配置生成数据库的细节:

namespace CodeFirstTest.Migrations
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class InitialCreate : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.Orders",
                c => new
                    {
                        ID = c.Int(nullable: false, identity: true),
                        Customer = c.String(),
                        OrderDate = c.DateTime(nullable: false),
                    })
                .PrimaryKey(t => t.ID);

            CreateTable(
                "dbo.OrderDetails",
                c => new
                    {
                        ID = c.Int(nullable: false, identity: true),
                        Product = c.String(),
                        OrderID = c.Int(nullable: false),
                    })
                .PrimaryKey(t => t.ID)
                .ForeignKey("dbo.Orders", t => t.OrderID, cascadeDelete: true)
                .Index(t => t.OrderID);

        }

        public override void Down()
        {
            DropIndex("dbo.OrderDetails", new[] { "OrderID" });
            DropForeignKey("dbo.OrderDetails", "OrderID", "dbo.Orders");
            DropTable("dbo.OrderDetails");
            DropTable("dbo.Orders");
        }
    }
}

 

3.执行“Add-Migration AddEmployee”命令,添加一个名为AddEmployee的迁移

 

 

4.执行“Update-Database”命令,更新数据库架构

如果更新数据库存在冲突而不能执行更新,可以添加 -Force强制执行,例如:“Update-Database -Force”

5.设置自动迁移

每次都通过控制台来进行迁移太过麻烦,可以设置为自动迁移。

  1. AutomaticMigrationsEnabled:获取或设置 指示迁移数据库时是否可使用自动迁移的值。

  2. AutomaticMigrationDataLossAllowed:获取或设置 指示是否可接受自动迁移期间的数据丢失的值。如果设置为false,则将在数据丢失可能作为自动迁移一部分出现时引发异常。

代码调用实例

            using (var db = new OrderTestContext("CodeFirstTest"))
            {
                Order Order = new Order();
                Order.Customer = "aehyok";
                Order.OrderDate = DateTime.Now;
                db.Orders.Add(Order);
                db.SaveChanges();

                IQueryable<Order> Orders = from Orderes in db.Orders
                                           select Orderes;
                foreach (Order O in Orders)
                {
                    Console.WriteLine("OrderID is {0},Customer is {1}", O.ID, O.Customer);
                }
            }

 

 调用结果展示

有两条数据,一条是上一篇博文添加的数据,第二条就是今天测试添加的。

 

时间: 2024-11-08 19:14:39

Entity Framework CodeFirst数据迁移的相关文章

entity framework做数据迁移报错

问题描述 错误提示是:参数@objname不明确或所声明的@objtype(COLUMN)有误.请问这个怎么解决? 解决方案 解决方案二:这个字段的类型不匹配

Entity Framework CodeFirst尝试

原文:Entity Framework CodeFirst尝试 前言 Code First模式我们称之为"代码优先"模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时开发人员只需要编写对应的数据类(其实就是领域模型的实现过程),然后自动生成数据库.这样设计的好处在于我们可以针对概念模型进行所有数据操作而不必关系数据的存储关系,使我们可以更加自然的采用面向对象的方式进行面向数据的应用程序开发. 从某种角度来看,其实"Code First"

mvc4-Appharbor 平台 使用 EF codefirst 数据迁移后出现异常!

问题描述 Appharbor 平台 使用 EF codefirst 数据迁移后出现异常! 我在Appharbor 上面使用了免费的sql server 数据库链接使用的是 EF5 codefirst,刚刚给一个表添加了一列,然后数据迁移之后,这个数据库就不知道怎么回事用不了了. 这个是网站上的显示,问题我标注上去了: 本地sqlserver management也连不上了: 大半夜的急死了...各位大牛谁帮我看看不知道我提供的数据够不够,不够告诉我我再找 楼主今年刚毕业,做外包比较忙也很可怜,只

entity framework 级联数据的删除

问题描述 数据采用级联方式:一个工程进程类(ProjectProcess),包含一个工程详情类(Project);详细情况类包含一个联系人信息(Personal_Info)详细情况如下://工程进程类publicclassProjectProcess{///<summary>///进程记录序列号///</summary>[Key][Required]publicGuidProcessIndex{get;set;}///<summary>///工程情况///</su

EF5.0 CodeFirst数据迁移找不到Shell10.0

问题描述 PM>Enable-MigrationsSystem.IO.FileNotFoundException:Couldnotloadfileorassembly'Microsoft.VisualStudio.Shell,Version=10.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'oroneofitsdependencies.系统找不到指定的文件.我gacutil去看了.只有shell12.0没有10.0通过NuGet下载

Entity Framework 5.0基础系列

原文:Entity Framework 5.0基础系列 1.Entity Framework简介 http://www.cnblogs.com/aehyok/p/3315991.html 2.Entity Framework DBFirst尝试http://www.cnblogs.com/aehyok/p/3318892.html 3.Entity Framework ModelFirst尝试http://www.cnblogs.com/aehyok/p/3323438.html 4.Entit

Entity Framework 5.0系列之Code First数据库迁移

我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Code First如何更新已有的模型呢?今天我们简单介绍一下Entity Framework的数据迁移功能. Entity Framework配置 在开始今天的话题之前先来看一下Entity Framework的配置,因为有很多朋友因为配置文件的问题造成"Migrations"命令执行失败.

Oracle中使用Entity Framework 6.x Code-First方式开发

去年写过一篇EF的简单学习笔记,当时EF还不支持Oracle的Code-First开发模式,今天无意又看了下Oracle官网,发现EF6.X已经支持了,并且给出了二篇教程(英文版): 1.Using NuGet to Install and Configure Oracle Data Provider for .NET 2.Entity Framework Code First and Code First Migrations for Oracle Database 基本上照着做就行了,为了方

使用NuGet助您玩转代码生成数据:Entity Framework 之Code First

在Code First中,编写完代码并运行之后,我们的Model会同步到Db中,但是往往我们 需要的是编写完Model就生成数据库,而不是等UI部分完成并运行之后才看到数据库,借助NuGet程序包管理器 可以让我们即时完成Code=>DB. 准备:1.本人开发工具为VS2012,使用的是.NET Framework 4.5 (EF5): 2.然后确保已在VS扩展中安装了最新的"NuGet程序包管理器": 3.常用的三行 NuGet用于EF命令(当然可以直接用命令"get