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");
}
}
}
Code First 下自动更新数据库结构(Automatic Migrations)的更多相关文章
- Code First 更新数据库结构(简单实现方法:会删除原来的数据)
之前在 http://www.cnblogs.com/mmcmmc/p/3833265.html 写到关于“Code First 更新数据库结构”的东西. 可是由于某种原因,新手们会出现各种问题,好了 ...
- Entity Framework 6 Code First的简单使用和更新数据库结构
一.安装Entity Framework 6 在项目中右击选择“管理NuGet程序包",联机搜索Entity Framework,点击安装 二.配置数据库连接 在App.config中加入数 ...
- EF-使用迁移技术让程序自动更新数据库表结构
承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析 本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与 ...
- EntityFrameworkCore使用Migrations自动更新数据库
EntityFrameworkCore使用Migrations自动更新数据库 系统环境:Win10 IDE:VS2017 RC4 .netcore版本:1.1 一.新建ASP.NET Core Web ...
- Cordova webapp实战开发:(5)如何写一个Andorid下自动更新的插件?
在 <Cordova webapp实战开发:(4)Android环境搭建>中我们搭建好了开发环境,也给大家布置了调用插件的预习作业,做得如何了呢?今天我们来学一下如何自己从头建立一个And ...
- 在linux和windows下自动备份数据库
摘要: 详细介绍在windows和linux下自动备份数据库的过程,希望可以让新手立即上手吧! 本文档内容共分为2大部分:linux和windows Linux和windows都分为:准备工作和操作阶 ...
- atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4
atitit.自动生成数据库结构脚本,或者更换数据库,基于hibernate4 目前近况:: 更换数据库,但是是使用spring集成的. <!-- hibernate配置文件路径 --> ...
- EF修改model自动更新数据库
最近用MVC+EF学习时遇到修改model后而数据库没更新报错,就在网上找关于数据迁移自动更新数据库的,折腾了大半天终于弄了出来 第一步:在程序包管理器控制台里: Enable-Migrations ...
- day35-hibernate映射 03-Hibernate持久态对象自动更新数据库
持久态对象一个非常重要的能力:自动更新数据库. package cn.itcast.hibernate3.demo1; import static org.junit.Assert.*; import ...
随机推荐
- bat和cmd文件是什么,dos又是什么东西
bat文件是dos下的批处理文件.批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用cm ...
- pip install失败报错解决方案
cmd pip install 某些包时报错 pip install Consider using the `--user` option or check the permissions. 只需要p ...
- 使用Dapper.Contrib
public T Query(string sql, object param) { using (IDbConnection dbConnection = Connection) { if (dbC ...
- PostgreSQL 登录时在命令行中输入密码
有时候需要设置定时任务直接执行 sql 语句,但是 postgresql 默认需要人工输入密码,以下命令可以直接在命令行中直接填入密码 PGPASSWORD=pass1234 psql -U MyUs ...
- 【Mybatis】MyBatis之整合Spring(八)
创建环境 系统:macOS Java:1.8 软件:eclipse,maven,mysql 创建步骤 本例:创建一个Maven项目(SpringMVC+Spring+Mybatis),页面上展示员工列 ...
- JFreechart从入门到放弃
JFreechart从入门到放弃 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 http://www.jfree.org/jfreechart/ 引言 干嘛用的 使用java画图, ...
- python通过socket实现多个连接并实现ssh功能详解
python通过socket实现多个连接并实现ssh功能详解 一.前言 上一篇中我们已经知道了客户端通过socket来连接服务端,进行了一次数据传输,那如何实现客户端多次发生数据?而服务端接受多个客户 ...
- while死循环
while死循环放入主线程要注意,如果处理不当可能引起界面假死,如果界面假死,可以放入子线程中(如果每个循环处理时间现对于CPU很短,则建议在本次循环结束的尾部加入Sleep以释放对CPU的占用) C ...
- [ kvm ] 学习笔记 1:Linux 操作系统及虚拟化
1. 前言 一台计算机是由一堆硬件设备组合而成,在硬件之上是操作系统,操作系统与计算机硬件密不可分,操作系统用来管理所有的硬件资源提供服务,各个硬件设备是通过 总线 进行连接起来的: 在操作系统之上, ...
- 【Leetcode_easy】1042. Flower Planting With No Adjacent
problem 1042. Flower Planting With No Adjacent 参考 1. Leetcode_easy_1042. Flower Planting With No Adj ...