为了建立数据库,你须要执行操做:git
您将在本章后面看到的全部数据库查询都使用这些步骤, 我如今开始详细介绍。github
使用 ef core 所需的关键类是应用程序的 dbcontext。这个类继承自EF Core的 DbContext,并经过添加各类属性让您的软件可以访问数据库表。它也包含了一些你能够重写的方法来访问EF Core 的其余属性。好比,配置数据库建模等等。web
图2.6给出了应用的DbContext概览,并指出了全部重要的部分。数据库
图2.6中,值得注意的一点是,应用的DbContext没有包含Review实体和BookAuthor实体的**DbSet<T>**属性。这是由于这两个实体类只能经过 book 类访问,稍后你会看到。架构
NOTE:我先跳过配置数据库建模,这个能够经过在应用的DbContext的OnModel-Creating 方法中实现。第6和7章会涉及到数据库建模的细节。函数
第1章向你展现了经过重写OnConfiguring方法建立应用的DbContext。那种方式的缺点是数据库链接串是固定的。本章你将使用另外一种方法,由于我想在开发和单元测试阶段是使用不一样的数据库。你将使用一种方法,这种方法经过应用的DbContext构造函数提供数据库链接字符串。工具
NOTE:第15章将涉及到EF Core应用程序的单元测试。单元测试
清单2.2提供了建立应用程序的dbcontext(称为efcorecontext)时数据库的Options(DbContextOptions)。老实说,这个清单基于个人单元测试,由于他有益于向你展现组件的各个部分。第5章,将在ASP.NET Core应用中使用EF Core,经过依赖注入的反射方式构建应用的DbContext。测试
在清单的末尾,你在using语句内部建立了一个EfCoreContext的实例。为何要用using语句呢?由于DbContext有一个IDisposable接口,因此你在使用完成以后,必须释放。从如今起,你看到的context变量,基本上使用了清单2.2的方式或者类似的方式建立的。spa
使用EF Core建立数据库有几种方式,可是一般使用EF Core的migrations特性。这将使用应用程序的 dbcontext 和实体类,就像我刚才描述的那样, 做为数据库结构的模型。Add-Migration命令首先对数据库建模,而后使用该模型,生成命令以建立适合该模型的数据库。
TIP:若是你正在运行从github上下载的岁随书源码,你不须要执行Migrate命令。由于代码里使用了context.Database.EnsureCreated命令。这种方式没有使用Migrate灵活,可是不须要你敲命令便可建立数据库。
除了建立数据库,migrations 命令的伟大之处在于,它们能够更新数据库根据你的实体模型变化。若是你更改了实体模型或者应用DbContext的配置,Add- Migration会构建一系列命令来更新现有的数据库。
为了使用migration特性,你须要在你的启动项目安装Microsoft.EntityFrameworkCore.Tools包,能够在NuGet管理器中搜索。这将使你可以在Visual Studio Package Manager Console (PMC)中时使用Migrate命令。 这是你须要的:
Add-Migration MyMigrationName —这会建立一系列命令来对数据库进行迁移,从当前状态到与你的应用DbContext和实体模型相匹配的状态。命令中的MyMigrationName是你将要迁移到的名字。
Update-Database —这个命令会把 Add-Migration构建的命令应用到你的数据库。若是数据库不存在,Update-Database 命令 将会执行建立。若是数据库已经存在,Update-Database 命令将会检测是否执行过数据库迁移。若是有数据库迁移丢失,Update-Database命令会执行迁移。
NOTE 你也可使用EF Core的命令行界面(CLI)来执行这些命令(http://mng.bz/454w)。第11章将会列出两种命令VS 2017 和 CLI两种版本的命令。此外,. net 2.1 还将引入全局工具,这将容许您经过正常命令调用这些命令行函数。
替代使用Update-Database命令的方式是在你应用的startup代码中调用context.Database.Migrate方法。这种方法对于承载的 asp. net core web 应用程序很是有用;第5章将包含这个选项,包括它的一些限制。
NOTE 你也可使用EF Core的命令行界面(CLI)来执行这些命令(http://mng.bz/454w)。第11章将会列出两种命令VS 2017 和 CLI两种版本的命令。此外,. net 2.1 还将引入全局工具,这将容许您经过正常命令调用这些命令行函数。
尽管 ef core的迁移功能颇有用, 但它并不涵盖数据库结构更改的全部类型。此外,对于某些项目,数据库将在 ef core 以外定义和管理,这就意味着你不能使用EF Core的migrate特性。第11章探讨了可用于数据库迁移的选项,以及他们的利弊。
若是你的应用的DbContext的项目和你的启动项目是独立的(如本书的项目架构),Add-Migration命令稍微有一点复杂。
在图书APP中,应用的DbContext在DataLayer项目中,而ASP.NET Core应用在EfCoreInAction项目中(本章稍后会解释为何这样设计)。若要添加EF Core 迁移,Add-Migration 命令以下:
Add-Migration Chapter02 -Project DataLayer -StartupProject
您还须要为迁移提供一种方法来建立一个应用的DbContext的实例。图书APP的DbContext(EfCoreContext),有一个无参构造函数,因此Add-Migration命令会失败。为了解决这个潜在的问题,Add-Migration会查找一个实现了IDesignTimeDbContextFactory<T>泛型接口的类。这容许你提供类来建立一个正确配置的实例,以便Add-Migration能够工做,咱们的实例中也是这样作的。详情查看http://mng.bz/7tYR.
参考