zoukankan      html  css  js  c++  java
  • Entity Framework 实体数据模型——数据库更新和迁移

    一、EF 设计器数据库更新

      1、首先创建项目:MyEFProject  并 添加新建项:

         

         其次,选择 ADO.NET 实体数据模型 并 命名为:StudentDataModel

         

            然后,选择 来自数据库的 EF 设计器:

         

         接着,导入数据库文件:

         

           最后,选择要进行映射的Student表:

           

      2、从数据库更新模型

        EF 设计器在完成设置之后,如果数据库有任何修改,我们可以通过更新功能来完成同步模型的操作。

        打开 .edmx 文件的编辑界面,在空白位置点击鼠标右键,选择从数据库更新模型:

        

        出现更新向导弹层,可以看到,它有三个页签:添加、刷新 和 删除。

          ①添加:该页签会展示数据库中尚未加入模型文件的项。 可以看到未加入模型的 Course 表 赫然在列!

          

          选择 Course 表,点击 完成 即可将其加入模型文件。

          

          ②刷新:该页签会展示数据库中已加入模型文件的项。

          

          ③删除:该页签会展示模型文件中无法映射的数据库项。

              比如数据库中原本存在的对象被删除,数据模型却无法得知此对象已经不存在,

              其映射的模型还是会显示,此时其相关的对象信息便会出现在删除页签中。

          

        EF 设计器同时提供了其他功能,以维护数据库结构与数据模型的映射,然而可视化界面在实际维护开发中的操作并不容易,

        比较好的方式是采用Code First模式。

    二、Code First 数据库迁移

      与视觉操作界面相比,Code First 机制提供了一套命令行模式的迁移工具,来协助我们有效的进行数据库与数据模型的同步维护操作。

      1、数据库迁移

        接下来,先创建一个的项目:CFMigrations,

        打开 “SQL Sever 对象资源管理器” (视图 ->SQL Sever 对象资源管理器)选择 数据库 点击鼠标右键,选择 添加新数据库:

        

         

        然后在选择 ADO.NET 实体数据模型 时,选择 来自数据库的 Code First:

         

        选择刚刚新建的数据库:

        

         好了,数据模型已经建立完成。接下来需要添加一个 Student.cs 类文件:

        using System;
        using System.Collections.Generic;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
    
        namespace CFMigrations
        {
            public class Student
            {
                public int Id { get; set; }
                public string StudentName { get; set; }
                public bool Sex { get; set; }
            }
        }

        打开 CFStudentInfoModel.cs 类文件,添加 Students 属性:

        

           在迁移的过程中,Students 属性会在 StudentInfo 数据库中创建一个新的 Student 数据表。

        现在需要打开 程序管理器控制台:工具 → NuGet包管理器 → 程序包管理器控制台。

        

         在 PM> 后面键入 Enable-Migrations 并按 Enter 键,可以看到已为项目启动了迁移功能。

        

        在 PM> 后输入 Add-Migration AddStudent 命令,来建立迁移文件:

        AddStudent 是自定义名称,表示要创建的迁移文件名。

        

        可以看到,迁移功能自动创建的迁移文件 202011270635371_AddStudent.cs,默认是以:创建的日期时间+_+自定义迁移名。

        

         这个文件里存在两个方法:Up 和 Down。

        Up 方法表示此次迁移的内容,将在连接数据库时创建 Student 表并根据 Student 类的属性设置其映射字段及类型。

        Down 方法表示将 Students 表从数据库中删除。通过调用该方法可以将数据库恢复至此次迁移前的状态。

        Code First 迁移通过这两个方法记录每次变动的内容,以支持数据库的升级和降级。

        我们可以通过每一个带时间信息的迁移文件名,便捷的来进行回溯迁移。

        

        在 PM> 后输入 Update-Database 命令,来完成第一次的迁移操作:

        

         接下来打开 服务器资源管理器 (在视图菜单下) 对话框中的数据库,看到以下界面证明迁移成功:

        

         然后在主程序Program.cs 中键入以下内容:

            static void Main(string[] args)
            {
                using (var cxt = new CFStudentInfoModel())
                {
                    var count = cxt.Students.Count();
                    Console.WriteLine($"学生表有{count}个学生");
                    Console.ReadKey();
                }
            }

        F5 运行,可以看到:

       

          好了,迁移完成!

       打开迁移成功的数据库,不难发现多了个 __MigrationHistory 表,它是用来记录迁移操作的。

          

          对比一下可以看出,MigrationId 字段记录的是所执行的迁移文件的名称,通过这些记录,我们可以很方便的追踪到每一次的迁移内容。

      2、结构变动迁移

        需求总在变,完成第一次迁移之后,难免会一成不变。接下来总结一下在结构变动后该如何进行同步迁移。

        首先,打开 Student 类,并在其中添加一个 Age 属性。

        

        此时如果运行程序,会报如下错误:

        

        这是因为实体类发生了改变,却没有映射到数据库所导致的错误。

        我们需要重新打开 “程序包管理控制台”,并在其中依次键入以下命令:

        ① Add-Migration AddStudentAgeProperty 

        Update-Database

         

        每次进行迁移操作,迁移程序就会生成一个对应时间点的迁移文件。

           执行完成以后,程序又可以运行了。

        如果想探究一下迁移程序在进行迁移是所使用的SQL语句,我们可以通过 Update-Database -Verbose 命令来进行查看。

        

       3、指定迁移

        在执行 Update-Database 命令时,可以进一步指定所要迁移的版本:

        Update-Database -TargetMigration:AddStudent

        这个命令会指定迁移到首次迁移的状态,也就是降级迁移。但如果是平级迁移就不会产生任何影响。

         

         当然我们还可以通过 Update-Database -TargetMigration:AddStudentAgeProperty 命令来回滚到进行降级迁移前的状态。

  • 相关阅读:
    有人向我反馈了一个bug
    java.lang.ClassNotFoundException: org.springframework.core.SpringProperties
    Maven pom文件提示Missing artifact org.springframework:spring-context-support:jar:3.2.2.RELEASE:compile
    在业务逻辑中如何进行数据库的事务管理。
    about to fork child process, waiting until server is ready for connections. forked process: 2676 ERROR: child process failed, exited with error number 100
    tomcat底层原理实现
    springmvc 动态代理 JDK实现与模拟JDK纯手写实现。
    纯手写SpringMVC架构,用注解实现springmvc过程
    数据库连接池原理 与实现(动脑学院Jack老师课后自己的练习有感)
    定时器中实现数据库表数据移动的功能,Exception in thread "Timer-0" isExist java.lang.NullPointerException定时器中线程报错。
  • 原文地址:https://www.cnblogs.com/LittleBai/p/13969012.html
Copyright © 2011-2022 走看看