asp.net core系列 30 EF管理数据库架构--必备知识 迁移

摘要:
管理数据库模式概述EFCore提供了两种保持EFCore模型和数据库模式同步的主要方法。第一个基于EFCore模型,第二个基于数据库。(1) 如果您希望EFCore模型占上风,请使用迁移。当对EFCore模型进行更改时,该方法将相应的模式更改增量应用于数据库,以保持数据库与EFCore模型兼容。(2) 如果希望数据库模式占主导地位,请使用

一.管理数据库架构概述

         EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步。一是以 EF Core 模型为基准,二是以数据库为基准。

           (1)如果希望以 EF Core 模型为准,请使用迁移。 对 EF Core 模型进行更改时,此方法会以增量方式将相应架构更改应用到数据库,以使数据库保持与 EF Core 模型兼容。

           (2)如果希望以数据库架构为准,请使用反向工程。 使用此方法,可通过将数据库架构反向工程到 EF Core 模型来生成相应的 DbContext 和实体类型。

  

  1.1. 迁移概述

    在开发期间,数据模型发生更改后,会与数据库不同步。 虽然可以删除该数据库,让 EF 创建一个新的数据库来匹配该模型,但此过程会导致数据丢失。迁移作用是指:在 EF Core 中使用迁移功能,能够以递增方式更新数据库架构,使其与应用程序的数据模型保持同步,同时保留数据库中的现有数据。

      迁移包括 命令行工具和API,可协助执行以下任务:

             (1) 创建迁移。 生成数据库更新的代码脚本,用来准备将应用模型同步到数据库。

             (2) 更新数据库。通过“创建迁移”的代码脚本,同步数据库。

             (3) 自定义迁移代码。有时需要修改或补充应用模型,并同步数据库。

             (4) 删除迁移。 删除生成的迁移版本(该版本没有更新到数据库)。

             (5) 还原迁移。 撤消回滚数据库更改(该版本已更新到数据库)。

             (6) 生成 SQL脚本。 可能需要一个脚本来更新生产数据库,或者对迁移代码进行故障排除。

             (7) 在运行时应用迁移。 如果在设计期间更新和运行脚本不是最佳选项时,可在运行时调用 Migrate() 方法。

  2.1 安装命令工具

    (1)对于Visual Studio开发,建议使用Package Manager Console(程序包管理器控制台)工具,使用windows上的PowerShell脚本。

              (2)对于其他开发环境,请选择.NET Core CLI工具,使用dotnet命令是跨平台的。

    本篇使用Visual Studio开发,使用Package Manager Console工具来进行迁移管理,用PowerShell脚本,并附带上跨平台管理 的dotnet命令。还是使用Blog和Post应用模型来演示。

 二. 命令演示

  2.1  创建迁移

    在定义初始化模型后,即应创建数据库。 若要添加初始迁移,请运行以下命令,其中InitialCreate属于自定义迁移类名,它继承了DbContext。

PowerShelldotnet
Add-Migration InitialCreatedotnet ef migrations add InitialCreate

    关于准备工作和创建迁移注意事项这里不在说明,请参考“asp.net core 系列 20 EF基于数据模型创建数据库”。在开发中,一般都是使用多层架构,这里新建了一个实体类库EFGetStarted.AspNetCore.Model,在web项目的"依赖项"上右击添加引用,选择实体类库。

    在实体类库上安装数据库提供程序。创建三个类BloggingContext类(继承DbContext)、Blog实体类、Post实体类。接着使用Package Manager Console工具运行Add-Migration InitialCreate命令。如下所图所示:

asp.net core系列 30 EF管理数据库架构--必备知识 迁移第1张

    当运行了Add-Migration InitialCreate后,将在项目中生成一个Migrations 文件夹,并在其中生成三个文件,文件名中的时间戳有助于保证文件按时间顺序排列:

      (1) 00000000000000_InitialCreate.cs--主迁移文件。 包含应用迁移所需的操作 Up() 和还原迁移所需的操作Down() 。

asp.net core系列 30 EF管理数据库架构--必备知识 迁移第2张

      (2) 00000000000000_InitialCreate.Designer.cs--迁移元数据文件。 包含 EF 所用的信息,如给实体类型构建属性、主键、外键、索引、映射到数据表,主体和依赖关系等等,如下所示:

asp.net core系列 30 EF管理数据库架构--必备知识 迁移第3张

      (3) BloggingContextModelSnapshot.cs - 当前模型的快照。用于确定添加下一次迁移时更改的内容(用于递增更新)。

  2.2 更新数据库

    接下来,将迁移应用于数据库以创建架构。命令如下:

PowerShelldotnet
Update-Database InitialCreatedotnet ef database update InitialCreate

    注意:更新到数据库,需要创建数据库的连接。项目中配置数据库连接,一般是存放在web项目的appsettings.json文件中,并在Startup类中调用。这里演示是直接写死在Startup类代码中,如下所示:

     var connection = "Data Source = {ip}; Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;";
            services.AddDbContext<BloggingContext>
                (options => options.UseSqlServer(connection));

    在Package Manager Console工具中,运行Update-Database InitialCreate命令,同步到数据库,如下所示:

asp.net core系列 30 EF管理数据库架构--必备知识 迁移第4张

  2.3 自定义迁移代码

    更改 EF Core 模型后,数据库架构可能不同步。为使其保持最新,请再添加一个新的迁移。例如我在Blog实体类,新添加了一个属性,和修改了一个属性的CLR类型。

    public class Blog
    {
        public int BlogId { get; set; }

        //将string 改为char
        public char Name { get; set; }
        //新增一个属性
        public string Title { get; set; }

        public string Url { get; set; }
        public ICollection<Post> Posts { get; set; }
    }

    运行Add-Migration  Blog_Modifier,添加一个新的迁移

asp.net core系列 30 EF管理数据库架构--必备知识 迁移第5张

    再运行Update-Database Blog_Modifier,同步到数据库中。char类型的Name生成后默认是nvarchar(1),对于指定属性的长度,参考上篇关系数据库建模。

asp.net core系列 30 EF管理数据库架构--必备知识 迁移第6张

    查看数据库的迁移历史,可以查看到迁移ID  MigrationId,其中20190222031152_Blog_Modifier 是最新的迁移同步到数据库的版本。

asp.net core系列 30 EF管理数据库架构--必备知识 迁移第7张

     2.3.1 空迁移

      有时模型未变更,直接添加迁移也很有用处。 在这种情况下,添加新迁移会创建一个带空类的代码文件。可以自定义此迁移,执行与 EF Core 模型不直接相关的操作。 可能需要通过此方式管理的一些事项包括:

        (1)全文搜索

        (2)函数

        (3)存储过程

        (4)触发器

        (5)视图

      通过上面操作,以Code First模式下,不需要对数据库进行直接操作,在数据库建模上,DBA以检查数据库架构为主。

   

   2.4 删除迁移

     有时修,项目在添加迁移后,意识到需要在应用迁移前对 EF Core 模型作出其他更改。 要删除上个迁移。 删除迁移是使用了Add-Migration生成迁移后,还没有应用Update-Database同步到数据库架构。请使用如下命令。

PowerShelldotnet
Remove-Migration  Namedotnet ef migrations remove Name

   2.5 还原迁移

     如果已经对数据库应用一个迁移(或多个迁移),但需将其复原(回滚),需要使用更新数据库命令,并指定回滚时的目标迁移名称。下面还原到迁移名称InitialCreate状态时。运行PM> Update-Database InitialCreate后,数据库同步,回到了最初InitialCreate迁移状态,数据库Blogs表还原到了当初。

asp.net core系列 30 EF管理数据库架构--必备知识 迁移第8张

  2.6 生成 SQL 脚本

     调试迁移或将其部署到生产数据库时,生成一个 SQL 脚本很有帮助。 之后可进一步检查该脚本的准确性并对其作出调整以满足生产数据库的需求 该脚本还可与部署技术结合使用。 基本命令如下。

PowerShelldotnet
Script-Migrationdotnet ef migrations script

     Script-Migration参数介绍:

-From<String>开始迁移。迁移可以通过名称或ID来标识。数字0是一种特殊情况,这意味着在第一次迁移之前。默认值为0
-To<String>结束迁移。默认值为最后一次迁移。
-Idempotent生成可在任何迁移时在数据库上使用的脚本。
-Output <String>要将结果写入的文件。如果省略该参数,则在创建应用程序运行时文件的文件夹中使用生成的名称创建文件,例如:/obj/Debug/netcoreapp2.1/ghbkztfz.sql/

    下面的示例使用InitialCreate迁移版本,创建一个sql脚本文件,输出到D盘。

    PM> Script-Migration -From 0  -To InitialCreate -Output D:InitialCreate.sql
asp.net core系列 30 EF管理数据库架构--必备知识 迁移第9张asp.net core系列 30 EF管理数据库架构--必备知识 迁移第10张
IF OBJECT_ID(N'[__EFMigrationsHistory]') IS NULL
BEGIN
    CREATE TABLE [__EFMigrationsHistory] (
        [MigrationId] nvarchar(150) NOT NULL,
        [ProductVersion] nvarchar(32) NOT NULL,
        CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
    );
END;

GO

CREATE TABLE [Blogs] (
    [BlogId] int NOT NULL IDENTITY,
    [Name] nvarchar(max) NULL,
    [Url] nvarchar(max) NULL,
    CONSTRAINT [PK_Blogs] PRIMARY KEY ([BlogId])
);

GO

CREATE TABLE [Posts] (
    [PostId] int NOT NULL IDENTITY,
    [Title] nvarchar(max) NULL,
    [Content] nvarchar(max) NULL,
    [BlogId] int NOT NULL,
    CONSTRAINT [PK_Posts] PRIMARY KEY ([PostId]),
    CONSTRAINT [FK_Posts_Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [Blogs] ([BlogId]) ON DELETE CASCADE
);

GO

CREATE INDEX [IX_Posts_BlogId] ON [Posts] ([BlogId]);

GO

INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
VALUES (N'20190222024519_InitialCreate', N'2.2.1-servicing-10028');

GO
View Code

    

  2.7 在运行时应用迁移

    某些应用程序可能希望在启动或首次运行期间在运行时应用迁移。使用该Migrate()方法执行此操作。

    myDbContext.Database.Migrate();    

    注意:此方法并不适合所有场景。 尽管此方法非常适合具有本地数据库的应用,但是大多数应用程序需要更可靠的部署策略,例如生成 SQL 脚本。

              请勿在 Migrate() 前调用 EnsureCreated()。 EnsureCreated() 会绕过迁移创建架构,这会导致 Migrate() 失败。

   参考文献:

    EF迁移

    Package Manager Console

免责声明:文章转载自《asp.net core系列 30 EF管理数据库架构--必备知识 迁移》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇urllib的实现---cookie处理乱码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Confluence迁移

本次操作系统版本Centos7.3,Confluence版本5.9.9。 一、数据迁移 1、在旧Confluence上打包 “confluence和confluence-data”整个目录,默认安装的话confluence-data在/var/下,confluence在/opt/下。 #自定义安装在/usr/目录下[root@wiki ~]# ls /us...

MongoDB基本介绍及一些用法

 满足海量存储需求和访问的面向文档的数据库:MongoDB,CouchDB   MongoDB  Nice, I like it very much.   面向文档的非关系数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能。MongoDB是用C++开发的,而CouchDB则是Erlang开发的:   1、MongoD...

备份与还原mysql 数据库的常用命令。

一、备份数据: Mysqldump常用命令: mysqldump -u用户名 -p密码 --databases 数据库1 数据库2 > xxx.sql 常见选项: -u: 用户名 -p: 密码 -P: 端口号,不写默认3306 --all-databases, -A:备份所有数据库 --databases, -B: 用于备份多个数据库,如果没有该选项...

【SQL注入】之MSSQL注入

(本文仅为平时学习记录,若有错误请大佬指出,如果本文能帮到你那我也是很开心啦) 该笔记参考网络中的文章,本文仅为了学习交流,严禁非法使用!!! 一、MSSQL手工注入 测试使用Windows Server 2008 R2 中使用IIS搭建的MSSQL-SQLi-Labs站点的第一关(该站点可在Github中找到) 攻击者:Windows 10系统(宿主机)...

软件开发阶段数据库升级维护策略

    软件开发阶段数据库升级维护策略 一 为什么要维护升级   1.1 现状和出现的问题 如果你开发一个的项目,没有用到数据库,那么你不用维护数据库。 如果你开发一个项目,用到数据库了,但是从不用修改,那么数据库的维护也相对的简单。 当你开发一个大的项目,数据库有很多表,视图,存储过程,数据库分成了几个,开发的团队很大,开发的周期很长,由于业务的需求数据...

使用vs2010自带的数据库的方法

Microsoft SQL Server Database File(SqlClient)。选择数据库文件目录,或者创建数据库文件的目录---一般选择工程所在目录,然后给数据库一个名字.mdf。选择Use Windows Authentication。然后选择OK,YES。……这样创建数据库呢不是很好。关于“数据库版本为655 无法打开,此服务器支持612...