一.管理数据库架构概述

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。

PowerShell dotnet
Add-Migration InitialCreate dotnet ef migrations add InitialCreate

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

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

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

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

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

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

  2.2 更新数据库

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

PowerShell dotnet
Update-Database InitialCreate dotnet 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命令,同步到数据库,如下所示:

  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,添加一个新的迁移

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

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

    2.3.1 空迁移

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

        (1)全文搜索

        (2)函数

        (3)存储过程

        (4)触发器

        (5)视图

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

  

  2.4 删除迁移

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

PowerShell dotnet
Remove-Migration  Name dotnet ef migrations remove Name

  2.5 还原迁移

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

  2.6 生成 SQL 脚本

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

PowerShell dotnet
Script-Migration dotnet 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
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

    

  2.7 在运行时应用迁移

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

    myDbContext.Database.Migrate();    

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

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

  参考文献:

    EF迁移

    Package Manager Console

asp.net core系列 30 EF管理数据库架构--必备知识 迁移的更多相关文章

  1. asp.net core系列 31 EF管理数据库架构--必备知识 反向工程

    一.   反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC.对于其他开发环境,请选择.NET Core CLI工具( ...

  2. asp.net core 系列 21 EF现有数据库进行反向工程

    一.概述 在上篇中使用EF基于数据模型创建数据库,  本篇继续使用 EF  基于数据库创建数据模型.  实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序.已有 ...

  3. asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)

    一.连接字符串 在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现.连接字符串可以存储在 appsettings.json ...

  4. asp.net core 系列 20 EF基于数据模型创建数据库

    一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种cod ...

  5. asp.net core系列 29 EF模型配置(查询类型,关系数据库建模)

    一.查询类型 此功能是EF Core 2.1中的新功能. EF Core除了实体类型之外,EF Core模型还可以包含查询类型,这些查询类型是针对“未映射到实体类型”的数据获取.比如视图,或只读数据表 ...

  6. asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)

    一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent ...

  7. asp.net core系列 35 EF保存数据(2) -- EF系列结束

    一.事务 (1) 事务接着上篇继续讲完.如果使用了多种数据访问技术,来访问关系型数据库,则可能希望在这些不同技术所执行的操作之间共享事务.下面示例显示了如何在同一事务中执行 ADO.NET SqlCl ...

  8. asp.net core系列 34 EF保存数据(1)

    一. 基本数据 每个EF上下文实例都有一个 ChangeTracker(更改跟踪器),它负责跟踪需要写入数据库的更改. 当更改实体类的实例时(修改属性,删除实例,新建实例等),这些更改会记录在 Cha ...

  9. asp.net core系列 33 EF查询数据 (2)

    一. 原生SQL查询 接着上篇讲.通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询. 在无法使用 LINQ 表达要执行的查询时,或因使用 LINQ 查询 ...

随机推荐

  1. 学习React Native必看的几个开源项目

    学习React native ,分享几个不错的开源项目,相信你学完之后,一定会有所收获.如果还没有了解RN的同学们可以参考手把手教你React Native 实战之开山篇<一> 1.Fac ...

  2. 实验吧——隐写术之复杂的QR_code

    好久没有更新隐写术方面的题目了,对不起各位小可爱,今天我会多多更新几篇文章,来慰藉你们! 永远爱你们的 ---------新宝宝 1:复杂的QR_code 解题思路:保存图片之后使用在线解码工具,并没 ...

  3. FTRL(Follow The Regularized Leader)学习总结

    摘要: 1.算法概述 2.算法要点与推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合 内容: 1.算法概述 FTRL是一种适用于处理超大规模数据的,含大量稀疏特征的在线学习的 ...

  4. eShopOnContainers 知多少[9]:Ocelot gateways

    引言 客户端与微服务的通信问题永远是一个绕不开的问题,对于小型微服务应用,客户端与微服务可以使用直连的方式进行通信,但对于对于大型的微服务应用我们将不得不面对以下问题: 如何降低客户端到后台的请求数量 ...

  5. Visual Studio Code 中文界面设置

    Visual Studio Code 中文界面设置 昨天,想要试一下用 VS Code 写 Markdown 格式的博客,下载下来发现是英文界面: 按照我以前的经验应该会自动提示切换语言的,但是这次等 ...

  6. 【ODI】| 数据ETL:从零开始使用Oracle ODI完成数据集成(三)

    资料库的创建.体系结构的创建.模型反向工程都已经完成了,下面就是创建以及执行接口来完成工作了. 浏览前两节请点击: [ODI]| 数据ETL:从零开始使用Oracle ODI完成数据集成(一) [OD ...

  7. http/2.0时代已经来临了!

    知识分享  文章转自:https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/78906348 现在是资源共享的时代,同样也是知识分享的时代,如 ...

  8. 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历

    异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...

  9. Visual Studio 2019 发布活动 - 2019 年 4 月 2 日

    Visual Studio 2019 发布活动 2019 年 4 月 2 日,星期二 | 上午 9:00 (PT) 围观: https://visualstudio.microsoft.com/zh- ...

  10. mssql sqlserver 给已存在表添加新的字段及字段备注的方法

    转自:http://www.maomao365.com/?p=8102 摘要: 下文讲述向已存在表上添加新字段及字段备注的方法,如下所示: 实验环境:sql server 2008 R2 1. 添加新 ...