array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Code First 下自动更新数据库结构(Automatic Migrations) - 爱码网

示例 Web.config

Code First 下自动更新数据库结构(Automatic Migrations)
<?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>
Code First 下自动更新数据库结构(Automatic Migrations)

Product.cs

Code First 下自动更新数据库结构(Automatic Migrations)
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; }
        */
    }
}
Code First 下自动更新数据库结构(Automatic Migrations)

MyContext.cs

Code First 下自动更新数据库结构(Automatic Migrations)
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; }
    }
}
Code First 下自动更新数据库结构(Automatic Migrations)

Demo.aspx.cs

Code First 下自动更新数据库结构(Automatic Migrations)
/*
 * 通过 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());
            }
        }
    }
}
Code First 下自动更新数据库结构(Automatic Migrations)

Migrations/Configuration.cs

Code First 下自动更新数据库结构(Automatic Migrations)
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" }
            //    );
            //
        }
    }
}
Code First 下自动更新数据库结构(Automatic Migrations)

Migrations/201202290715581_InitialCreate.cs

Code First 下自动更新数据库结构(Automatic Migrations)
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");
        }
    }
}
Code First 下自动更新数据库结构(Automatic Migrations)

Migrations/201202290718442_MyTestFirst.cs

Code First 下自动更新数据库结构(Automatic Migrations)
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");
        }
    }
}
Code First 下自动更新数据库结构(Automatic Migrations)

相关文章: