EF Core 快速上手——创建应用的DbContext
系列文章
EF Core 快速上手——EF Core的三种主要关系类型
本节导航
- 定义应用的DbContext
- 创建DbContext的一个实例
创建应用的数据库
为了创建数据库,你需要执行操作:
- 定义应用的DbContext,这个可以通过创建一个类并让它继承自EF Core 的DbContext来实现。
- 每次要访问数据库时,都要创建该类的实例。
您将在本章后面看到的所有数据库查询都使用这些步骤,
我现在开始详细介绍。
2.2.1 定义应用的DbContext: EfCoreContext
使用 ef core 所需的关键类是应用程序的 dbcontext。这个类继承自EF Core的 DbContext,并通过添加各种属性让您的软件能够访问数据库表。它也包含了一些你可以重写的方法来访问EF Core 的其他属性。比如,配置数据库建模等等。
图2.6给出了应用的DbContext概览,并指出了所有重要的部分。

图2.6中,值得注意的一点是,应用的DbContext没有包含Review实体和BookAuthor实体的DbSet属性。这是因为这两个实体类只能通过 book 类访问,稍后你会看到。
NOTE:我先跳过配置数据库建模,这个可以通过在应用的DbContext的OnModel-Creating 方法中实现。第6和7章会涉及到数据库建模的细节。
2.2.2 创建DbContext的一个实例
第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的方式或者相似的方式创建的。
2.2.3 为你的应用创建数据库
使用EF Core创建数据库有几种方式,但是通常使用EF Core的migrations特性。这将使用应用程序的 dbcontext 和实体类,就像我刚才描述的那样, 作为数据库结构的模型。Add-Migration命令首先对数据库建模,然后使用该模型,生成命令以创建适合该模型的数据库。
除了创建数据库,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泛型接口的类。这允许你提供类来创建一个正确配置的实例,以便Add-Migration可以工作,我们的实例中也是这样做的。详情查看http://mng.bz/7tYR.
参考
- 《Entity Framework Core In Action》

EF Core 快速上手——创建应用的DbContext的更多相关文章
- EF Core 快速上手——EF Core的三种主要关系类型
系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询 本 ...
- EF Core 快速上手——EF Core 入门
EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用 本文是对 ...
- Mysql EF Core 快速构建 Web Api
(1)首先创建一个.net core web api web项目; (2)因为我们使用的是ef连接mysql数据库,通过NuGet安装MySql.Data.EntityFrameworkCore,以来 ...
- EF Core 2.2 对多个 DbContext 单个数据库的情况进行迁移的示例
目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 需要注意的情况 场景 在一个项目中,使用了多个 DbContext 且使用同一个数据库的情况 创建新项目 打 ...
- EF Core 2.2 对多个 DbContext 多个数据库的情况进行迁移的示例
目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 场景 在一个项目中,使用了多个 DbContext 且每个 DbContext 对应一个数据库的情况 创建新 ...
- .net core快速上手
2014年11月12日的Connect ();开发者活动上宣布将.NET堆栈基于MIT协议开源,并且提供开源保证,托管在Github上.当时的版本与最终目标相距甚远,然而有一点可以肯定的是,这是一个与 ...
- [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- EF Core 2.0 新特性
前言 目前 EF Core 的最新版本为 2.0.0-priview1-final,所以本篇文章主要是针对此版本的一些说明. 注意:如果你要在Visual Studio 中使用 .NET Core 2 ...
- [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
随机推荐
- 你不可不知的iOS与Android差异点!
1.运行机制的区别 Android:沙盒运行机制,采用真后台运行,将所有的应用都保存在RAM中,按home键,程序被挂在了后台,实际未退出,因程序在后台运行,所以可以收到推送消息,导致内存越用越低,越 ...
- eShopOnContainers 知多少[5]:EventBus With RabbitMQ
1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉.事件总线是对发布-订阅模式的一种实现.它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需 ...
- linux根目录下的各文件夹含义说明
在早期的 UNIX 系统中,各个厂家各自定义了自己的 UNIX 系统文件目录,比较混乱. Linux 面世不久后,对文件目录进行了标准化,于1994年对根文件目录做了统一的规范, 推出 FHS ( F ...
- 收集整理的一些c++书籍(推荐)
Accelerated C++中文版 .pdf Beyond the C++ Standard Library(Boost)中文版.pdf Beyond the C++ Standard Librar ...
- TensorFlow从1到2(二)续讲从锅炉工到AI专家
图片样本可视化 原文第四篇中,我们介绍了官方的入门案例MNIST,功能是识别手写的数字0-9.这是一个非常基础的TensorFlow应用,地位相当于通常语言学习的"Hello World!& ...
- 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法
一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...
- maven 依赖中scope标签的配置范围详解
在创建Maven项目时,需要在pom.xml 文件中添加相应的依赖,其中有一个scope标签,该标签是设置该依赖范围 (maven项目包含三种classpath{编译classpath,测试class ...
- html基础复习
1.标签选择器 div{} 2.类选择器 .one class="one" 3.id选择器(定义+调用) #one{} id="one" ...
- Storm入门(九)Storm常见模式之流聚合
流聚合(stream join)是指将具有共同元组(tuple)字段的数据流(两个或者多个)聚合形成一个新的数据流的过程. 从定义上看,流聚合和SQL中表的聚合(table join)很像,但是二者有 ...
- 深入理解 call,apply 和 bind
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...