系列文章

EF Core 快速上手——EF Core 入门

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命令首先对数据库建模,然后使用该模型,生成命令以创建适合该模型的数据库。

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泛型接口的类。这允许你提供类来创建一个正确配置的实例,以便Add-Migration可以工作,我们的实例中也是这样做的。详情查看http://mng.bz/7tYR.

参考

  •   《Entity Framework Core In Action》

EF Core 快速上手——创建应用的DbContext的更多相关文章

  1. EF Core 快速上手——EF Core的三种主要关系类型

    系列文章 EF Core 快速上手--EF Core 入门 本节导航 三种数据库关系类型建模 Migration方式创建和习修改数据库 定义和创建应用DbContext 将复杂查询拆分为子查询   本 ...

  2. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  3. Mysql EF Core 快速构建 Web Api

    (1)首先创建一个.net core web api web项目; (2)因为我们使用的是ef连接mysql数据库,通过NuGet安装MySql.Data.EntityFrameworkCore,以来 ...

  4. EF Core 2.2 对多个 DbContext 单个数据库的情况进行迁移的示例

    目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 需要注意的情况 场景 在一个项目中,使用了多个 DbContext 且使用同一个数据库的情况 创建新项目 打 ...

  5. EF Core 2.2 对多个 DbContext 多个数据库的情况进行迁移的示例

    目录 场景 创建新项目 创建第一个模型 创建第二个模型 使用依赖注入注册上下文 创建数据库 场景 在一个项目中,使用了多个 DbContext 且每个 DbContext 对应一个数据库的情况 创建新 ...

  6. .net core快速上手

    2014年11月12日的Connect ();开发者活动上宣布将.NET堆栈基于MIT协议开源,并且提供开源保证,托管在Github上.当时的版本与最终目标相距甚远,然而有一点可以肯定的是,这是一个与 ...

  7. [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  8. EF Core 2.0 新特性

    前言 目前 EF Core 的最新版本为 2.0.0-priview1-final,所以本篇文章主要是针对此版本的一些说明. 注意:如果你要在Visual Studio 中使用 .NET Core 2 ...

  9. [翻译 EF Core in Action 2.1] 设置一个图书销售网站的场景

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

随机推荐

  1. web版仿微信聊天界面|h5仿微信电脑端案例开发

    前几天开发了一款手机端h5仿微信聊天,人唯有不停学习才能进步,这段时间倒腾着整理了下之前项目,又重新在原先的那版基础上开发了一款仿微信聊天电脑端web版本,聊天页面又重新优化了多图预览.视频播放,右键 ...

  2. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  3. Spring Boot 2.0 图文教程 | 集成邮件发送功能

    文章首发自个人微信公众号: 小哈学Java 个人网站: https://www.exception.site/springboot/spring-boots-send-mail 大家好,后续会间断地奉 ...

  4. 【重学计算机】操作系统D1章:计算机操作系统概述

    1. 计算机软硬件系统 冯诺伊曼结构 以运算单元为核心,控制流由指令流产生 程序和数据存储在主存中 主存是按地址访问,线性编址 指令由操作码和地址码组成 数据以二进制编码 其他:参考<重学计算机 ...

  5. css属性分类介绍

    css属性分类介绍 CSS分类目录 文本/字体/颜色 文本相关 字体相关 颜色相关 背景相关 大小/布局 大小属性 margin 外边距 padding 内边距 border 边框 position ...

  6. Java集合详解8:Java集合类细节精讲

    今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http://cmsblogs.com/?cat=5 具体 ...

  7. C# 将object对象转换为实体对象

    C# 将object对象转换为实体对象.一共两种方法. 第一种方法,代码如下: /// <summary> /// 将object对象转换为实体对象 /// </summary> ...

  8. Ubuntu 18.04编译AOSP源码

    总结一下我从Ubuntu 18.04下编译成功AOSP的过程,以及遇到的坑 我的电脑配置: OS: Ubuntu 18.04 bionic Kernel: x86_64 Linux 4.18.0-17 ...

  9. vscode创建net core控制台程序

    vscode近来深受的开发人员的喜爱.在下的前端同事们也纷纷使用vscode.在下就想了我等后端程序员也可以用vscode写C#代码.毕竟是从宇宙第一IDE  ----Visual Studio衍生的 ...

  10. 常用Latex公式

    注意: 1 在博客中书写Latex公式时,需在公式两侧用$包括 2 大括号{ }在Latex有本身的含义,如果要输出为普通字符需要使用\{...\} 符号 公式 说明 $ \in $ \in 包含 $ ...