[翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文
Entity Framework Core in Action
Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。因为没有中文版,所以本人对其进行翻译。 预计每两天一篇更新 PS: 翻译难免限于本人水平有不准确的地方,建议英文水平不错的同学直接查看原版,有不足的地方欢迎指正
第一部分目录导航
创建应用程序的数据库上下文
访问数据库前我们需要以下操作:
- 定义应用程序的数据库上下文,创建类并继承EF Core的DbContext类
- 访问数据库时,需要创建该类的实例
本章后面所有的数据库查询都是这些步骤,下面我会详细的描述这些步骤
定义应用程序的数据库上下文: EfCoreDbContext
使用EF Core的关键类就是应用程序的DbContext,该类继承EF Core的DbContext类. 添加各种属性代表数据库中的表. 它还可以覆盖基类方法使用EF Core的其他功能,比如配置数据库建模等. 图2.6展示了应用程序数据库上下文的概述并指出了重要的部分

图2.6中你并没有看到上一节提到的Review实体类和BookAuthor中间类的DbSet属性,不用惊讶,因为这两个实体类都只能通过Book类访问(这是一种设计思想,其实放在里面也没关系)
注: 上面没有介绍到配置数据库建模,在第六章与第七章中详细介绍了如何对数据库建模
创建应用程序数据库上下文实例
在第一章中我们在OnConfiguring方法中调用了UseSqlServer方法并硬编码了连接字符串,缺点很明显连接字符串是固定的,所以我们现在使用另一种方法. 我们希望使用不同的数据库用于开发和单元测试.
注: 第十五章介绍了对使用EF Core的应用程序进行单元测试
下图展示了创建应用程序数据库上下文时的选项,图中的代码是我在单元测试时使用的. 在第五章中介绍了在ASP.NET Core应用程序中使用EF Core,使用依赖注入的方式为应用程序提供数据库上下文的实例

图的最后,使用了using语句包裹了创建数据库上下文实例的代码,因为DbContext实现了IDisposable接口. context变量就是我们需要的数据库上下文实例
创建应用程序的数据库
使用EF Core创建数据库有好几种方法,大多数都会选择使用EF Core的迁移. 使用应用程序的数据库上下文和实体类作为数据库结构的模型. Add-Migration命令进行数据库建模,然后使用模型构建命令创建对应的数据库
注: 如果你使用的代码是从Github仓库下载的,那么不需要执行我们下面要用的迁移命令
迁移的好处是可以将代码中所做的任何更改来更新数据库,如果更改实体类或数据库上下文配置,使用Add-Migration命令可以创建最新的迁移文件
使用迁移,我们需要在应用程序的启动项安装Microsoft.EntityFramework.Tools的NuGet包,它的功能是让你在包管理控制台(PMC)使用迁移命令
Add-Migration MyMigrationName创建迁移命令,它会将所有更改(添加)的实体和等其他建模配置创建一个迁移文件, MyMigrationName是迁移的名称Update-Database应用迁移命令,如果不存在数据库会数据一个数据库,如果已存在命令会检查数据库的迁移版本并更新到应用程序中的最新版本(也有命令可以更新到指定版本)
注: 还可以使用EF Core的CLI运行这些命令 (参见https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/dotnet),第十一章列出了命令的列表. .Net Core2.1引入了全局工具可以直接运行命令
有另一种方法调用Update-Database命令,就是在应用程序的启动代码中调用context.Database.Migrate方法. 这种方法对托管的ASP.NET Core Web应用程序非常有用,第五章详细介绍了这种方法与其中的一些限制
注: 虽然EF Core的迁移功能很好用,但它并未涵盖所有类型的数据库结构更改. 对于某些项目据库据库不由EF Core定义和管理数据库,这意味着无法使用EF Core的迁移功能. 第十一章讨论了数据库迁移的选项以及它们的优缺点
如果是分层应用程序怎么办
一般的应用程序都是分层的,主网站是一个项目,数据访问层又是一个项目. 这时Add-Migration命令就要复杂一点
在图书应用程序中,应用程序的数据库上下文在名为DataLayer的项目中,ASP.NET Core Web程序在名为EfCoreInAction的项目中(我会在后面讲到为什么这么分层). 要添加迁移命令如下
Add-Migration Chapter02 -Project DataLayer -StartupProject EfCoreInAction
图书应用程序的数据库上下文 EfCoreContext 类没有无参构造函数,Add-Migration命令会失败,要解决这个潜在的问题,我们需要创建一个IDesignTimeDbContextFactory<T>接口的实现类,因为Add-Migration命令会去查找这个接口的实现. 这个实现类创建应用程序的数据库上下文的正确配置实现,使Add-Migration命令可以正常工作. 这也是在图书应用程序中所做的. 参见 https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/configuring-dbcontext#using-idesigntimedbcontextfactorytcontext
[翻译 EF Core in Action 2.2] 创建应用程序的数据库上下文的更多相关文章
- [翻译 EF Core in Action 1.8] MyFirstEfCoreApp应用程序设置
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.10] 应该在项目中使用EF Core吗?
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 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 in Action 2.1] 设置一个图书销售网站的场景
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 2.0] 查询数据库
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.7] MyFirstEfCoreApp访问的数据库
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 1.6]你的第一个EF Core应用程序
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译] EF Core in Action 关于这本书
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- [翻译 EF Core in Action 2.3] 理解EF Core数据库查询
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
随机推荐
- uedit,检测粘贴事件,替换粘贴内容
vue.editor.addListener("beforepaste",function(type, arg1, arg2){arg1.html="ddddddd&qu ...
- 基于opencv下对视频的灰度变换,高斯滤波,canny边缘检测处理,同窗体显示并保存
如题:使用opencv打开摄像头或视频文件,实时显示原始视频,将视频每一帧依次做灰度转换.高斯滤波.canny边缘检测处理(原始视频和这3个中间步骤处理结果分别在一个窗口显示),最后将边缘检测结果保存 ...
- hive------ Group by、join、distinct等实现原理
1. Hive 的 distribute by Order by 能够预期产生完全排序的结果,但是它是通过只用一个reduce来做到这点的.所以对于大规模的数据集它的效率非常低.在很多情况下,并不需要 ...
- 终于等到你: 图形化开源爬虫Hawk 3发布!
超级图形化爬虫Hawk已经发布两年半时间了,2015年升级到第二版,收到上千条用户反馈(tucao),100多个红包,总共666块五毛~一直想攒着这笔钱,去北境之王天通苑的龙德商场买最心爱的阿迪王! ...
- EF Core Model更新迁移
EF Core 迁移 感觉就是以前EF Code First的自动同步数据库功能 内容:在你新增.更新TableModel后,如何自动化的更新DB中的真实Table.以及对这些更改进行一个版本控制. ...
- Python_正则表达式样例
''' 正则表达式是字符串处理的有力工具和技术,正则表达式使用预定义的特定模式去匹配一类具有共同特征的字符串, 主要用于字符串处理,可以快速.准确地完成复杂的查找.替换等处理要求. 正则表达式由元字符 ...
- .net(C#)在Access数据库中执行sql脚本
自己写的一个工具类,主要是业务场景的需要. 主要有两个功能: ①执行包含sql语句的字符串 ②执行包含sql语句的文件 调用方式 /// <summary> /// 执行sql语句 /// ...
- 【转】Javascript错误处理——try…catch
无论我们编程多么精通,脚本错误怎是难免.可能是我们的错误造成,或异常输入,错误的服务器端响应以及无数个其他原因. 通常,当发送错误时脚本会立刻停止,打印至控制台. 但try...catch语法结构可以 ...
- SSM-Spring-10:Spring中cglib动态代理
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 何为动态代理,就不扯皮了,上一篇博客刚刚提到,那cglib动态代理又怎么写,我拿个和上个例子相似的案例来写 具 ...
- 在阿里云的CentOS环境中安装配置MySQL、JDK、Maven
Welcome to Alibaba Cloud Elastic Compute Service ! [root@izbp19stm1x1k2io1e7r3tz ~]# rpm -Uvh http:/ ...