• 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; }
        
    //加上一个时间戳,在并发操作的时候,只允许一个操作对其进行更改。另外一个操作对其更改时会报错。乐观锁的一种实现方式。
         [Timestamp]
         public byte[] RowVersion { get; set; }
    } }

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

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

    惊不惊喜?

    意不意外?

    高不高兴?

    开不开心?

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

  • 相关阅读:
    Android SDK Android NDK 官方下载地址
    编码转换工具 源码
    st_mode的剖析
    关于 python 字符编码的一些认识
    MFC中的argc和argv参数
    VC实现文件拖拽获取文件名
    CString 转 int
    《C语言程序设计实践教程》实验题源程序
    C语言 文件操作 结构体与文件 fgetc fputc fread fwrite
    C++语言 创建状态栏
  • 原文地址:https://www.cnblogs.com/williamwsj/p/7255419.html
Copyright © 2020-2023  润新知