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 JDK配置环境变量
1)将下载的jdk放置到一定文件夹中,注意文件夹名不能有中文! 2)设置环境变量 a.可以在系统变量中找到path这个变量,然后将jdk下的bin的根目录添加进去 注意:一定要放在path变量值的最前 ...
- appium---【已解决】【Mac】如何查看java的安装路径及JAVA_HOME环境变量的配置
报错截图:根据提示可以看出,JAVA_HOME的环境变量配置错误,需要重新配置. 1.查看Java版本 打开mac电脑,查看java版本,打开终端Terminal,通过命令查看java的版本 Luck ...
- Jmeter----创建第一个接口测试流程
第一步.创建线程 第二步.添加一个HTTP请求 第三步.设置request的请求头信息 根据自己需要填写的请求头信息进行填写,如下是我需要接口测试时填写的请求头 第四步.设置相关的HTTP请求参数,完 ...
- Python爬虫入门教程 60-100 python识别验证码,阿里、腾讯、百度、聚合数据等大公司都这么干
常见验证码 之前的博客中已经解决了一些常见验证码的问题,但是验证码是层出不穷的,目前解决验证码除了通过常规手段解决以外,还可以通过人工智能领域的深度学习去解决 深度学习?! 无疑对爬虫coder提高了 ...
- mvc、mvp和mvvm
一.MVC 设计图: 可能由于MVP.MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM.因为后两种都是基于MVC发展而来的. 1 ...
- pytest-allure-poco之allure全量详细用法
allure简介 Allure Framework是一个灵活的轻量级多语言测试报告工具.貌似是目前最漂亮的一个报告工具 python版本及必要库或工具 python 3.7 pytest 4.3.1 ...
- Sql的分库分表,及优化
对Sql细节优化 在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考. 首先给大家介绍一下分库分表 分库分表 分库 垂直分库 业务 ...
- IdentityModel 中文文档(v1.0.0) 目录
欢迎使用IdentityModel文档! 第一部分 协议客户端库 第1章 发现端点(Discovery Endpoint) 第2章 授权端点(Authorize Endpoint) 第3章 结束会话端 ...
- 委托与lambda关系
什么是委托委托是没有方法体的,声明委托就是一个关键字: delegate ,委托可以试有参无参,有返回值无返回值.和我们的方法是一样的.不同的区别是 委托没有方法体的,委托可放在类下也可以放在类的外面 ...
- 1.JAVA-Hello World
1.Java开发介绍 J2SE:Java 2 Platform Standard Edition(2005年之后更名为JAVA SE). 包含构成Java语言核心的类.比如:数据库连接.接口定义.数据 ...