EF-使用迁移技术让程序自动更新数据库表结构

Posted 夜月天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(50,ErrorMessage ="姓名的最大长度为50个字符")]
        public string Name { get; set; }

        [Range(typeof(DateTime),"1900-01-01","2017-07-01")]
        public DateTime? BirthDay { get; set; }

        [Range(1,150,ErrorMessage ="年龄范围在1~150岁之间")]
        public int? Age { get; set; }

        [MaxLength(100,ErrorMessage ="地址的最大长度为100个字符")]
        public string Address { get; set; }
    
//加上一个时间戳,在并发操作的时候,只允许一个操作对其进行更改。另外一个操作对其更改时会报错。乐观锁的一种实现方式。
     1622217506
     public byte[] RowVersion { get; set; }
} }

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

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

惊不惊喜?

意不意外?

高不高兴?

开不开心?

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

 

以上是关于EF-使用迁移技术让程序自动更新数据库表结构的主要内容,如果未能解决你的问题,请参考以下文章

七色花基本权限系统- 让EntityFramework Code First自动合并/迁移/数据初始化

EF Core codefirst数据迁移

ef codeFirst 修改表结构 增加字段等 EF code first需要重新生成库导致数据丢失的问题.

使用ef core的迁移功能并配置种子数据

EF 自动迁移不适用于虚拟属性

EF Core Model更新迁移