Code First 下自动更新数据库结构(Automatic Migrations)

示例 Web.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    </configSections>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <connectionStrings>
        <!--
            需要将 Persist Security Info 设置为 True,以便保存密码信息
            因为 Database.SetInitializer<MyContext>(new DropCreateDatabaseIfModelChanges<MyContext>()); 在判断 Code First 与数据库结构是否一致时需要连接 master 库
        -->
        <add name="MyConnection" providerName="System.Data.SqlClient" connectionString="server=.;database=MyDB;uid=sa;pwd=111111;Persist Security Info=True" />
    </connectionStrings>
</configuration>

Product.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.ComponentModel.DataAnnotations;

namespace EF43.UpdateSchema
{
    [Table("Product")]
    public class Product
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ProductId { get; set; }

        [Required]
        [Column("ProductName", TypeName="varchar")]
        public string Name { get; set; }

        /*
        为了测试 Automatic Migrations 可放开此注释,然后 Add-Migration 的话会自动生成结构迁移的相关代码
        public double Price { get; set; }
        */
    }
}

MyContext.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using System.Data.Entity;

namespace EF43.UpdateSchema
{
    // 创建的 Context 要继承自 DbContext
    public class MyContext : DbContext
    {
        // 指定数据库连接为:connectionStrings 中的 MyConnection
        public MyContext()
            : base("MyConnection")
        {

        }

        public DbSet<Product> Products { get; set; }
    }
}

Demo.aspx.cs

/*
 * 通过 NuGet 下载 Entity Framework 4.3
 *
 * 关于 Code First 下自动更新数据库结构(Automatic Migrations)的相关说明如下:
 * 注:需要通过 NuGet 的 Package Manager Console 输入相关命令
 *
 * 在更新了实体结构后输入如下命令
 * 1、Enable-Migrations
 *     启动迁移功能,会在项目根目录下生成 Migrations 文件夹,其内通常会有两个文件
 *     1. Configuration.cs - 相关配置,如是否需要自动迁移(默认为 false)等
 *     2. 201202290715581_InitialCreate.cs - 未迁移前的数据结构,前半部分为时间戳
 *
 * 2、Add-Migration -StartupProjectName EF43
 *     在指定的项目中增加一个迁移点,此命令后会要求输入一个 Name 参数,此参数的值为迁移点名称
 *     假设输入的迁移点名称为 MyFirstTest 则会生成一个类似如下的文件 201202290718442_MyTestFirst.cs,其包含两个方法 Up() 和 Down(),分别用于此迁移点的升级和降级
 *
 * 3、Update-Database -StartupProjectName EF43(将指定的项目的数据库结构升级到最新)
 *     Update-Database -TargetMigration:"201202290718442_MyTestFirst",将当前数据库结构升级到此迁移点(无参数 -TargetMigration 则为升级到最新)
 *     Update-Database -Script,显示用于更新数据库结构的相关 sql 代码
 *     Update-Database -Script -SourceMigration:"aaa" -TargetMigration:"bbb",显示将迁移点“aaa”升/降级到迁移点“bbb”的相关 sql 代码
 *
 * 注:如果发生“System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation”异常,请查看是否显示指定了项目名(本例为 -StartupProjectName EF43)
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Data.Entity;

namespace EF43.UpdateSchema
{
    public partial class Demo : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            using (var db = new MyContext())
            {
                Random random = new Random();

                var product = new Product { Name = "windows " + random.Next() };
                db.Products.Add(product);

                int recordsAffected = db.SaveChanges();
                Response.Write("影响到数据库的行数:" + recordsAffected.ToString());
            }
        }
    }
}

Migrations/Configuration.cs

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

    internal sealed class Configuration : DbMigrationsConfiguration<EF43.UpdateSchema.MyContext>
    {
        public Configuration()
        {
            // 默认情况下不会自动迁移数据库结构,还有许多其它相关设置,详看 DbMigrationsConfiguration<TContext>
            AutomaticMigrationsEnabled = false;
        }

        protected override void Seed(EF43.UpdateSchema.MyContext 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" }
            //    );
            //
        }
    }
}

Migrations/201202290715581_InitialCreate.cs

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

    public partial class InitialCreate : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "Product",
                c => new
                    {
                        ProductId = c.Int(nullable: false, identity: true),
                        ProductName = c.String(nullable: false, unicode: false),
                    })
                .PrimaryKey(t => t.ProductId);

        }

        public override void Down()
        {
            DropTable("Product");
        }
    }
}

Migrations/201202290718442_MyTestFirst.cs

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

    public partial class MyTestFirst : DbMigration
    {
        public override void Up()
        {
            // AddColumn("Product", "Price", c => c.Double(nullable: false));

            // 自动生成的代码如上,下面是我自定义的,用于设置新增字段的默认值
            // 还有许多其它相关设置,详看 DbMigration
            AddColumn("Product", "Price", c => c.Double(nullable: false, defaultValue: 10d));
        }

        public override void Down()
        {
            DropColumn("Product", "Price");
        }
    }
}

时间: 2024-12-25 20:30:33

Code First 下自动更新数据库结构(Automatic Migrations)的相关文章

Code First 更新数据库结构

参考:http://blog.csdn.net/sxycxwb/article/details/12186159 0.删除之前的数据库 1.Run the Enable-Migrations command in Package Manager Console 进入(PM)软件包管理控制台 (视图——>其他窗口——>程序包管理控制台)输入以下指令:Enable-Migrations 会提示:"No context type was found in the assembly"

Code First Migrations更新数据库结构的具体步骤

我对 CodeFirst 的理解,与之对应的有 ModelFirst与 DatabaseFirst ,三者各有千秋,依项目实际情况自行选择. 1.开发过程中先行设计数据库并依此在项目中生成 *.dbml 或是 *.edmx 文件的,就是DatabaseFirst: 2.开发时先建立空的 *.edmx 文件,由此文件生成数据库的,就是ModelFirst: 3.使用 System.Data.Entity. DbContext 与 System.Data.Entity. DbSet构建数据模型,没有

EF-使用迁移技术让程序自动更新数据库表结构

承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与之对应的表结构. 无论承不承认,都要使用到visual studio的"程序包管理器控制台"执行相关的命令. 1.使用"程序包管理器控制台" 工具>NuGet程序包管理器>程序包管理器控制台 这货的界面是这样子的: 选中默认项目为DAL,因为我们在DAL项目

sqlite自动更新数据库

写一个类继承自  SQLiteOpenHelper 系统会自动添加构造方法. onCreate方法.onUpgrade方法 当数据库里面数据或者表结构有所改动时,咱们需要升级数据库 这个时候,版本加1.在update里面做相应修改. 需要注意的是,如果需要测试update,每次开始测试,version 值增大,如果和上次的相同,就不会促发update方法了 下面贴上代码 先是原来的表结构,对应的代码 import android.content.Context; import android.d

在linux和windows下自动备份数据库

摘要: 详细介绍在windows和linux下自动备份数据库的过程,希望可以让新手立即上手吧! 本文档内容共分为2大部分:linux和windows Linux和windows都分为:准备工作和操作阶段. Linux的详细步骤为:1.准备文件. 2.连接linux 3.实际操作也就是写命令 windows的详细步骤为:1.准备文件. 2.编辑任务和计划程序. 所用软件:notepad++,ssh 一.linux 1.准备工作(可以在windows下执行本操作) 创建三个文件 1.1文件名:exp

EF修改model自动更新数据库

最近用MVC+EF学习时遇到修改model后而数据库没更新报错,就在网上找关于数据迁移自动更新数据库的,折腾了大半天终于弄了出来 第一步:在程序包管理器控制台里: Enable-Migrations -ProjectName EF所在的项目名称 第二步:运行后会在字段生成Migrations文件夹,Migrations->Configuration.cs 类里把AutomaticMigrationsEnabled改为true(即设为model有改动自动更新数据库) 如有删除字段则要加 Autom

Cordova webapp实战开发:(6)如何写一个iOS下自动更新的插件?

上一篇我们学习了如何写一个Andorid下自动更新的插件,我想还有一部分看本系列blog的开发人员希望学习在iOS下如何做插件的吧,那么今天你就可以来看看这篇文字了. 本次练习你能学到的 学习如何获取iOS当前版本号 学习iOS下插件类的编写 学习iOS下插件的配置 学习iOS下插件的调用 主要内容 APP中[检查更新]显示当前版本号 插件类的编写 在上一篇介绍Andorid插件时我们贴出了很多源码,这里也直接贴出代码,首先是iOS下插件的代码. 我们在Plugins下新建两个文件,一个头文件

EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构

前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF core实现从数据实现多租户(2) : 按表分离   (主要关联文章) 这里我遇到的最主要问题是:由于多租户的表使用的是同一个数据库.由于这个原因,无法通过 Database.EnsureCreated() 自动创建多个结构相同但名字不同的表. 所以我在文中提到,需要自己跑脚本去创建多有的

Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?

在 <Cordova webapp实战开发:(4)Android环境搭建>中我们搭建好了开发环境,也给大家布置了调用插件的预习作业,做得如何了呢?今天我们来学一下如何自己从头建立一个Andorid下的cordova插件. 本次练习你能学到的 学习如何实现自动更新功能 学习插件类的编写 学习插件的配置 学习插件的调用 主要内容 打开APP后检查版本更新,如果有更新则弹出更新对话框 APP中[检查更新]显示当前版本号,并可以点击进行版本检查更新 如何实现自动更新功能 你可以自己写代码,也可以网上找