承接上一篇文章:关于类库中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. Angular 学习笔记 (version 6 小笔记)

    1. lazyload 的 path 变成相对路径了, 不过如果你用 ng update 的话, 依然可以不需要修改, cli config 好像能调支持绝对路径的写法. const routes: ...

  2. 猫眼电影爬取(二):requests+beautifulsoup,并将数据存储到mysql数据库

    上一篇通过requests+正则爬取了猫眼电影榜单,这次通过requests+beautifulsoup再爬取一次(其实这个网站更适合使用beautifulsoup库爬取) 1.先分析网页源码 可以看 ...

  3. (6)进程---Event事件

    # 阻塞事件 : e = Event()生成事件对象e e.wait()是给程序加阻塞 , 程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值是False] e.wait(2) 传参 ...

  4. 关于 Oracle DB CONSTRAINT约束的一些SQL ORA-02292: integrity constraint violated

    ALTER TABLE table_name DISABLE CONSTRAINT constraint_name; select * from all_constraints where owner ...

  5. org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608

    一.异常信息 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet reque ...

  6. 1 虚拟环境virtualenv

    一.windows下虚拟环境创建 1.1 虚拟环境virtualenv 如果在一台电脑上, 想开发多个不同的项目, 需要用到同一个包的不同版本, 如果使用上面的命令, 在同一个目录下安装或者更新, 新 ...

  7. 小程序分享转发功能实现demo

    /** * 用户点击右上角分享 */ onShareAppMessage: function() { //分享 console.log("分享") var that = this ...

  8. session一二事

    Session即回话,指一种持续性的.双向的连接.Session和Cookie在本质上没有什么区别,都是针对HTTP协议的局限性而提出的一种保持客户端和服务器间保持会话连接状态的机制. Session ...

  9. eclipse指定jdk路径

  10. 51nod-1181-两次筛法

    1181 质数中的质数(质数筛法)  题目来源: Sgu 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 如果一个质数,在质数列表中的编号也是质数,那么就 ...