承接上一篇文章:关于类库中EntityFramework之CodeFirst(代码优先)的操作浅析

本篇讲述的是怎么使用迁移技术让程序自动通过ORM框架将模型实体类结构映射到现有数据库,并新增或修改与之对应的表结构。

无论承不承认,都要使用到visual studio的“程序包管理器控制台”执行相关的命令。

1、使用"程序包管理器控制台"

工具》NuGet程序包管理器》程序包管理器控制台

这货的界面是这样子的:

选中默认项目为DAL,因为我们在DAL项目安装了EntityFramework程序包。输入命令Enable-Migrations,大小写无所谓,都可以。该命令的意思是:激活迁移,也就是激活程序中的自动迁移技术。该命令只有在安装了EntityFramework程序包的项目中有效。如果没有成功安装EntityFramework程序包,使用不了该命令,会出错。

激活迁移成功的界面如下图:

当DAL项目的迁移被激活成功后,会在该项目下自动生成一个Migrations文件夹,里面包含一个密封的迁移配置类,还有一个使用当前时间生成的类(该类中包含修改前的数据库中已经存在的表结构)。

2、迁移配置

打开DAL项目中Migrations文件夹下的Configuration.cs文件。将Configuration类的构造函数改为如下代码:

        public Configuration() {
//将AutomaticMigrationsEnabled设置true,表示启用自动迁移技术
AutomaticMigrationsEnabled = true;
//将AutomaticMigrationDataLossAllowed设置为true,表示在更新数据表结构时,允许丢失数据
AutomaticMigrationDataLossAllowed = true;
ContextKey = "DAL.DemoContext";
}

如果该Configuration与应用程序不是在同一程序集,则需要将该Configuration类的访问修饰符从internal改为public。这样,在应用程序中才能使用该Configuration类。

3、使用迁移

在控制台应用程序的Main方法中,加上Database.SetInitializer(new MigrateDatabaseToLatestVersion<DemoContext, DAL.Migrations.Configuration>())。如下图所示:

接下来运行程序。程序成功运行后,让我们来对比一下结果。

数据表结构更新前:

数据表结构更新后:

使用程序自动更新表结构成功!

4、模型类属性的特性约束

看一下上面的表结构,Name和Address的最大长度为max。

我们能否自定义一个最大的字符串长度呢?当然可以!

能否自动更新到表结构呢?你当我上面的那一篇幅文章是白讲的吗!!!

更新Model层的Student类,给某些字段添加特性约束。属性的特性约束,不仅在程序中可以使用,也能自动更新到数据库。如下代码:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Model {
//指定表名
[Table("Student")]
public class Student {
//指定该表的主键
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid ID { get; set; } [MaxLength(,ErrorMessage ="姓名的最大长度为50个字符")]
public string Name { get; set; } [Range(typeof(DateTime),"1900-01-01","2017-07-01")]
public DateTime? BirthDay { get; set; } [Range(,,ErrorMessage ="年龄范围在1~150岁之间")]
public int? Age { get; set; } [MaxLength(,ErrorMessage ="地址的最大长度为100个字符")]
public string Address { get; set; }
    
//加上一个时间戳,在并发操作的时候,只允许一个操作对其进行更改。另外一个操作对其更改时会报错。乐观锁的一种实现方式。
     [Timestamp]
     public byte[] RowVersion { get; set; }
}
}

运行程序后,我们看一下数据库中的表结构:

已经成功更新了Student表结构。

惊不惊喜?

意不意外?

高不高兴?

开不开心?

在CodeFirst模式中,我们没有动过数据库一个代码,完全靠的是ORM框架去映射实体模型和数据库。只在程序代码中动动手指头,就能轻轻松松的调用数据库,使用数据。

EF-使用迁移技术让程序自动更新数据库表结构的更多相关文章

  1. 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  2. Mybatis总结之如何自动生成数据库表结构

    一般情况下,用Mybatis的时候是先设计表结构再进行实体类以及映射文件编写的,特别是用代码生成器的时候. 但有时候不想用代码生成器,也不想定义表结构,那怎么办? 这个时候就会想到Hibernate, ...

  3. powdesingner 更新数据库表结构

    1.连接数据库 2更新数据库表结构

  4. MVC Code First 当实体类发生变化时,如何自动更新数据库表

    下面做一个例子,Category是用户新建的一个实体类,然后添加一个字段,然后让数据库中的Category表也添加一个字段 1.Category.cs

  5. 利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  6. Hibernate由model类自动同步数据库表结构

    在开发中遇到了个问题,每次测试数据库增加表结构的时候,本地pull下最新代码导致启动报错,上网搜了快速解决办法---->hibernate 配置属性中,hibernate.hbm2ddl.aut ...

  7. egg 框架自动创建数据库表结构

    // {app_root}/app.js module.exports = app => { app.beforeStart(async () => { // 从配置中心获取 MySQL ...

  8. Python自动获取数据库表结构

    Sandman https://sandman.readthedocs.io/en/latest/#

  9. Automap sqlalchemy.ext.automap 自动映射数据库表结构

    from sqlalchemy.ext.automap import automap_base from sqlalchemy.orm import Session from sqlalchemy i ...

随机推荐

  1. AtCoder Regular Contest 094 D Worst Case

    Worst Case 思路: 使 a <= b 当 a == b 时 或者 a == b - 1 时,答案显然为 2 * (a - 1) 否则找到最大的 c ,使得 c * c < a * ...

  2. JAVA基础知识总结:二十二

    一.反射机制 1.概念 反射机制指的是程序在运行的过程中,对于任意一个类,都能够知道这个类对应的所有的属性和方法:对于任意一个对象,都能够调用其中的任意的方法和属性,在Java中,把这种动态获取信息以 ...

  3. js实现文件的上传和输出,拖拽上传图片

    js文件上传 文件下载 以前的文件的下载都是在服务器,现在也是放在服务器比较好,有时候为了一些开发的方便,我们临时把处理的数据就放在了本地,然后自己访问.这个也是可以的. 1.利用html5的 Fil ...

  4. WAMP环境配置

    mysql 5.7.12 php 7.1 apache 24 windows 10 64bit 下载好代码后, 1.首先把更目录的sql.sql导入到数据库2.打开application\config ...

  5. HTML 第十三章总结

    前言 这一章的内容主要是处理 HTML 中的 tabular data,可以分为三个部分: 如何在 HTML 中创建表格 如何在 CSS 中 style 表格 如何在 CSS 中 style HTML ...

  6. idea ----> 使用idea工具整合mybaiti时出现的问题总结

    使用idea测试mabtis实例时出现  java.lang.IllegalArgumentException: Mapped Statements collection does not conta ...

  7. You Don't Know JS: Scope & Closures (附加:Lexical/dynamic作用域)(附加:Lexical-this)

    JavaScript只有Lexical Scope 模式 Lexical Scope就是在写代码的时候,定义函数的时候创建的作用域! 而动态作用域是在runtime时,函数被调用的地方的作用域! 实际 ...

  8. CentOS7 下源代码安装mysql5.6

    ###### mysql ######### 引言:这里选用mysql5.6版本,5.7版本编译时间需要几个小时. 编译安装环境: yum -y install make gcc-c++ cmake ...

  9. Anya and Cubes CodeForces - 525E (双端搜索)

    大意: 给定$n$元素序列$a$, 可以任选不超过$k$个$a_i$变换为$a_i!$, 求变换后任选若干元素和为S的方案数. 分成两块暴搜, 复杂度$O(3^{\frac{n}{2}})$ #inc ...

  10. 迷宫最短路径问题的dfs,bfs实现

    迷宫的最短路径 给定一个大小为 N×M的迷宫.迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动.请求出从起点到终点所需的小步数.请注意,本题假定从起点一定可以移动到终点 限制条件:N,M ...