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 ...
随机推荐
- java创建线程的几种方式,了解一下
1.继承Thread,重写run() public class MyThread extends Thread{ @Override public void run() { System.out.p ...
- JDK10安装配置详解
JDK10安装配置详解 1. 下载jdk10 1.1 官网下载jdk7的软件包: 地址:http://www.oracle.com/technetwork/java/javase/dow ...
- window.history.back(-1);与window.go(-1);的区别
history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在 history.back(1) 前进 ...
- android使用.9图作为背景,内容不能居中的问题解决方案
在xml中使用.9图作为背景,内容不能居中,试了好多方法最后,加一个属性就ok了. android:padding:0dip; 解析:.9图作为背景时,不可拉伸的部分就相当于该空间的padding距离 ...
- go语言调度器源代码情景分析之五:汇编指令
本文是<go调度器源代码情景分析>系列 第一章 预备知识的第4小节. 汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运 ...
- Caffe源码理解3:Layer基类与template method设计模式
目录 写在前面 template method设计模式 Layer 基类 Layer成员变量 构造与析构 SetUp成员函数 前向传播与反向传播 其他成员函数 参考 博客:blog.shinelee. ...
- windows,分割路径.得出目录
#include <windows.h> #include <vector> #include <stdio.h> #include <string> ...
- windows下,读取快捷方式lnk所指向的路径
BOOL GetLnkFileName( OUT PWSTR pLnkName, OUT PWSTR OepnFileNameBuufer, IN DWORD OpenFileNameBufferSi ...
- html基础复习
1.标签选择器 div{} 2.类选择器 .one class="one" 3.id选择器(定义+调用) #one{} id="one" ...
- 前端css
CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). CSS语法 CSS实例 ...