[翻译 EF Core in Action 2.2] 建立应用程序的数据库上下文

Entity Framework Core in Action

Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另外一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。由于没有中文版,因此本人对其进行翻译。 预计每两天一篇更新 PS: 翻译不免限于本人水平有不许确的地方,建议英文水平不错的同窗直接查看原版,有不足的地方欢迎指正html

第一部分目录导航

建立应用程序的数据库上下文

访问数据库前咱们须要如下操做:数据库

  • 定义应用程序的数据库上下文,建立类并继承EF Core的DbContext类
  • 访问数据库时,须要建立该类的实例

本章后面全部的数据库查询都是这些步骤,下面我会详细的描述这些步骤ide

定义应用程序的数据库上下文: EfCoreDbContext

使用EF Core的关键类就是应用程序的DbContext,该类继承EF Core的DbContext类. 添加各类属性表明数据库中的表. 它还能够覆盖基类方法使用EF Core的其余功能,好比配置数据库建模等. 图2.6展现了应用程序数据库上下文的概述并指出了重要的部分函数

图2.6中你并无看到上一节提到的Review实体类和BookAuthor中间类的DbSet 属性,不用惊讶,由于这两个实体类都只能经过Book类访问(这是一种设计思想,其实放在里面也不要紧) 工具

注: 上面没有介绍到配置数据库建模,在第六章与第七章中详细介绍了如何对数据库建模单元测试

建立应用程序数据库上下文实例

在第一章中咱们在OnConfiguring方法中调用了UseSqlServer方法并硬编码了链接字符串,缺点很明显链接字符串是固定的,因此咱们如今使用另外一种方法. 咱们但愿使用不一样的数据库用于开发和单元测试.学习

注: 第十五章介绍了对使用EF Core的应用程序进行单元测试测试

下图展现了建立应用程序数据库上下文时的选项,图中的代码是我在单元测试时使用的. 在第五章中介绍了在ASP.NET Core应用程序中使用EF Core,使用依赖注入的方式为应用程序提供数据库上下文的实例网站

图的最后,使用了using语句包裹了建立数据库上下文实例的代码,由于DbContext实现了IDisposable接口. context变量就是咱们须要的数据库上下文实例编码

建立应用程序的数据库

使用EF Core建立数据库有好几种方法,大多数都会选择使用EF Core的迁移. 使用应用程序的数据库上下文和实体类做为数据库结构的模型. Add-Migration命令进行数据库建模,而后使用模型构建命令建立对应的数据库

注: 若是你使用的代码是从Github仓库下载的,那么不须要执行咱们下面要用的迁移命令

迁移的好处是能够将代码中所作的任何更改来更新数据库,若是更改实体类或数据库上下文配置,使用Add-Migration命令能够建立最新的迁移文件

使用迁移,咱们须要在应用程序的启动项安装Microsoft.EntityFramework.Tools的NuGet包,它的功能是让你在包管理控制台(PMC)使用迁移命令

  • Add-Migration MyMigrationName 建立迁移命令,它会将全部更改(添加)的实体和等其余建模配置建立一个迁移文件, MyMigrationName是迁移的名称
  • Update-Database 应用迁移命令,若是不存在数据库会数据一个数据库,若是已存在命令会检查数据库的迁移版本并更新到应用程序中的最新版本(也有命令能够更新到指定版本)

注: 还可使用EF Core的CLI运行这些命令 (参见https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/dotnet),第十一章列出了命令的列表. .Net Core2.1引入了全局工具能够直接运行命令

有另外一种方法调用Update-Database命令,就是在应用程序的启动代码中调用context.Database.Migrate方法. 这种方法对托管的ASP.NET Core Web应用程序很是有用,第五章详细介绍了这种方法与其中的一些限制

注: 虽然EF Core的迁移功能很好用,但它并未涵盖全部类型的数据库结构更改. 对于某些项目据库据库不禁EF Core定义和管理数据库,这意味着没法使用EF Core的迁移功能. 第十一章讨论了数据库迁移的选项以及它们的优缺点

若是是分层应用程序怎么办

通常的应用程序都是分层的,主网站是一个项目,数据访问层又是一个项目. 这时Add-Migration命令就要复杂一点

在图书应用程序中,应用程序的数据库上下文在名为DataLayer的项目中,ASP.NET Core Web程序在名为EfCoreInAction的项目中(我会在后面讲到为何这么分层). 要添加迁移命令以下

Add-Migration Chapter02 -Project DataLayer -StartupProject EfCoreInAction

图书应用程序的数据库上下文 EfCoreContext 类没有无参构造函数,Add-Migration命令会失败,要解决这个潜在的问题,咱们须要建立一个IDesignTimeDbContextFactory<T>接口的实现类,由于Add-Migration命令会去查找这个接口的实现. 这个实现类建立应用程序的数据库上下文的正确配置实现,使Add-Migration命令能够正常工做. 这也是在图书应用程序中所作的. 参见 https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/configuring-dbcontext#using-idesigntimedbcontextfactorytcontext

相关文章
相关标签/搜索