EF-使用迁移技术让程序自动更新数据库表结构
承接上一篇文章:关于类库中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-使用迁移技术让程序自动更新数据库表结构的更多相关文章
- 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档
对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...
- Mybatis总结之如何自动生成数据库表结构
一般情况下,用Mybatis的时候是先设计表结构再进行实体类以及映射文件编写的,特别是用代码生成器的时候. 但有时候不想用代码生成器,也不想定义表结构,那怎么办? 这个时候就会想到Hibernate, ...
- powdesingner 更新数据库表结构
1.连接数据库 2更新数据库表结构
- MVC Code First 当实体类发生变化时,如何自动更新数据库表
下面做一个例子,Category是用户新建的一个实体类,然后添加一个字段,然后让数据库中的Category表也添加一个字段 1.Category.cs
- 利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档
对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...
- Hibernate由model类自动同步数据库表结构
在开发中遇到了个问题,每次测试数据库增加表结构的时候,本地pull下最新代码导致启动报错,上网搜了快速解决办法---->hibernate 配置属性中,hibernate.hbm2ddl.aut ...
- egg 框架自动创建数据库表结构
// {app_root}/app.js module.exports = app => { app.beforeStart(async () => { // 从配置中心获取 MySQL ...
- Python自动获取数据库表结构
Sandman https://sandman.readthedocs.io/en/latest/#
- Automap sqlalchemy.ext.automap 自动映射数据库表结构
from sqlalchemy.ext.automap import automap_base from sqlalchemy.orm import Session from sqlalchemy i ...
随机推荐
- myeclipse新建maven项目
右键 new--->project ---->maven project 出现bank 右键点击bank---->maven4Myeclipse---->new maven ...
- 第 3 章 镜像 - 015 - 调试 Dockerfile
如何 debug Dockerfile 通过 Dockerfile 构建镜像的过程 从 base 镜像运行一个容器 执行命令对容器做修改 执行类似 docker commit 的操作,生成一个新的镜像 ...
- c# 静态构造函数与私有构造函数共存
在使用静态构造函数的时候应该注意几点: 1.静态构造函数既没有访问修饰符,也没有参数.因为是.NET调用的,所以像public和private等修饰符就没有意义了. 2.是在创建第一个类实例或任何静态 ...
- 分享:selenium(一) xpath
xpath无所不能定位. https://www.w3.org/TR/xpath/all/#axes 两个神器:firebug.xpath-checker 举例:混合定位 //td[a//fron ...
- 内核开启VF小结
2017-8-29 16:33:40 内核开启VF小结: 1. eth2上创建4个VFecho 4 > /sys/class/net/eth2/device/sriov_numvfs2. 关闭e ...
- android -------- 常用依赖库
// bannercompile 'com.youth.banner:banner:1.4.9' // recyclecompile 'com.android.support:recyclervie ...
- centOS 6.5采用python+nginx+uwsgi实现爬金十财经日历
上一篇中有关于安装nginx.python.uwsgi的过程,这里不再重述.下面是有关在具体布署中的一些过程和问题处理 一.因为用到了bs4(BeautifulSoup)\paste\lxml所以这些 ...
- Vue自动化工具(Vue-CLI)的安装
安装VUM 前面学习了普通组件以后,接下来我们继续学习单文件组件则需要提前先安装准备一些组件开发工具.否则无法使用和学习单文件组件. 一般情况下,单文件组件,我们运行在 自动化工具vue-CLI中,可 ...
- 『TensotFlow』RNN中文文本_下_暨研究生开学感想
承前 接上节代码『TensotFlow』RNN中文文本_上, import numpy as np import tensorflow as tf from collections import Co ...
- windos 开启openssl
前面我使用的是wampserver百度提示的软件,然后我卸载了,自己重新再官网上下载了一个比较新的版本,然后我按照的时候用默认路径,他的的都不用怎么配置,新版本都给你弄好了. 低版本的要在httped ...