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 ...
随机推荐
- setUp()和tearDown()函数
1.什么是setUp()和tearDown()函数? 2.为什么我们要用setUp()和tearDown()函数? 3.我们该怎样用setUp()和tearDown()? 1.什么是setUp()和t ...
- Bot Framework 搭建聊天机器人
这周我来跟大家分享的是在Microsoft Build 2016上发布的微软聊天机器人的框架. 现如今,各种人工智能充斥在我们的生活里.最典型的人工智能产品就是聊天机器人,它既可以陪我们聊天,也可以替 ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)
本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...
- 基于思科模拟器的AAA配置与验证
拓扑图: 地址表如图所示 三个路由器之间采用ospf协议达到互通 先做ping通测试 由ApingB 由ApingC 配置AAA认证 在R1上 R1(config)#username shuaiqiy ...
- ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...
- 从PRISM开始学WPF,Prism7更新了什么
当时我在搬运Prism6.3的sample代码的时候,就是因为网上的资料太老旧,万万没想到这给自己挖了一个坑,因为我在做笔记的时候,prism已经在更新7.0了 现在已经是7.2了,(lll¬ω¬), ...
- docker(1)应用场景以及安装
今年来了新公司,公司没有用什么新技术,架构就简单的前后分离,但是我推一下新的技术,在这基础上我要培训一下同事,让他们能接受,对新技术不感到陌生,并且认可愿意去学习.其实在这个过程中也能让他们认同我这个 ...
- Spring Boot入门(二):使用Profile实现多环境配置管理&如何获取配置文件值
在上一篇博客Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件中,我们新建了一个最原始的Spring Boot项目,并使用了更为流行的yaml配置文件. ...
- 学习python的第一天
2019.4.25自我总结 一.Typora 关于用Typora 自我感觉良好,基本快捷键也比较简单,ps:还是要多用用 二.编程 1.编程语言 是用来定义计算机程序的形式语言.它是一种被标准化的交流 ...
- jqgrid three 树形结构
最近我们的表格中,需要更改数据的显示方式,就是jqgrid中以树形的方式显示.请先看图: 就是简单的这种从属方式.但是因为这个没有找到官方的文档(后来找到了,但是发现是翻译过来的,也不是很清楚),所以 ...