asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)
一.连接字符串
在上二篇中,ASP.NET Core 应用程序连接字符串是写死在ConfigureServices代码中,下面介绍通过配置来实现。连接字符串可以存储在 appsettings.json
、用户机密存储、其他配置源中。 下面示例演示appsettings.json
中存储的连接字符串,这样不管asp.net core在什么环境(Development、Staging 、Production)都能调用该文件。
"ConnectionStrings": {
"BloggingDatabase": "Data Source = {ip};Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;"
},
通常在Startup.cs
中
读取连接字符串。 使用GetConnectionString()
方法查找配置值,该查询的格式:ConnectionStrings:<connection string name>
其中键是connection
。
// var connection = "Data Source = {ip}; Initial Catalog = EFGetStarted.AspNetCore.NewDb; User ID = hsr;Password =js*2015;";
var connection = Configuration.GetConnectionString("BloggingDatabase");
services.AddDbContext<EFGetStartedAspNetCoreNewDbContext>(options => options.UseSqlServer(connection));
二. 连接复原
可以通过策略,自动重试已失败的数据库命令,通过提供“执行策略”,它封装检测故障,然后重试命令所需的逻辑,该功能可以应用于任何数据库。例如: SQL Server 提供程序,包括专门针对 SQL Server (包括 SQL Azure) 的执行策略。 它知道可以重试的异常类型,并且具有合理的默认值的最大重试,重试次数等之间的延迟。为上下文配置选项时将指定执行策略。 这通常位于派生上下文的 OnConfiguring
方法中,或位于 ASP.NET Core 应用程序的 Startup.cs
中。通过EnableRetryOnFailure方法参数重载,可以自定义设置失败故障重试次数。
//(1)配置在Startup.cs 中设置连接复原。
var connection = Configuration.GetConnectionString("BloggingDatabase");
services.AddDbContext<EFGetStartedAspNetCoreNewDbContext>
(options => { options.UseSqlServer(connection,sqlServerOptions=> sqlServerOptions.EnableRetryOnFailure()); }); //(2)配置在EF上下文的OnConfiguring方法中,设置连接复原
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=EFMiscellanous.ConnectionResiliency;Trusted_Connection=True;ConnectRetryCount=0",
options => options.EnableRetryOnFailure());
}
2.1 执行策略和事务
在出现故障时自动重试的执行策略需要能够回滚失败的重试块中的每个操作。启用重试后,通过 EF Core 执行的每个操作都将成为其自身的可重试操作。也就是说,如果出现暂时性故障,每个查询和对 SaveChanges() 的每次调用都将作为一个单元进行重试。
如果代码使用 BeginTransaction()
启动事务(设置sql事务),定义了自己的操作组(这些操作需要被视为一个单元)。如果发生故障,将需要回滚事务内的所有内容。 如果尝试在使用执行策略时执行此操作(发生故障重试),将收到如下所示的异常:"InvalidOperationException: 配置的执行策略 SqlServerRetryingExecutionStrategy 不支持用户启动的事务"。
解决方法:手动调用执行策略,委托中放入需要执行的所有内容。 如果发生暂时性故障,执行策略将再次调用委托。
//using Microsoft.EntityFrameworkCore;
using (var db = new EFGetStartedAspNetCoreNewDbContext())
{
var strategy = db.Database.CreateExecutionStrategy(); strategy.Execute(() =>
{
using (var context = new EFGetStartedAspNetCoreNewDbContext())
{
using (var transaction = context.Database.BeginTransaction())
{
context.Blogs.Add(new Blogs { Url = "http://blogs.msdn.com/dotnet" });
context.SaveChanges(); context.Blogs.Add(new Blogs { Url = "http://blogs.msdn.com/visualstudio" });
context.SaveChanges(); transaction.Commit();
}
}
});
}
三. 配置 DbContext介绍
下面简单介绍 DbContextOptions
配置 DbContext,
以使用特定的 EF Core 提供程序(数据库提供程序)和可选行为来连接到数据库的基本模式。DbContext配置是通过如:migrations命令来完成(migrations使用在asp.net core 系列 20中有讲到)。该工具能够发现和创建 DbContext
类型的工作实例,收集有关应用程序实体类型及其如何映射到数据库架构的详细信息。这些过程都可以自动执行。
DbContext
必须具有 DbContextOptions
的实例才能执行工作。对于DbContextOptions
实例包含如下配置信息:
(1) 数据库提供程序 。如使用Microsoft.EntityFrameworkCore.SqlServer提供程序,将提供扩展方法DbContextOptionsBuilder.UseSqlServer。如使用Microsoft.EntityFrameworkCore.Sqlite,将提供扩展方法DbContextOptionsBuilder. UseSqlite。这些扩展方法需要相应的提供程序包。
(2) 必要的数据库连接字符串,作为参数传递到上面讲到的扩展方法中, 如SqlServer 使用DbContextOptionsBuilder.UseSqlServer(connection
(3) 任何提供程序级别的可选行为选择器,是针对特定的数据库提供程序。如Microsoft.EntityFrameworkCore.SqlServer, 使用SqlServerDbContextOptionsBuilder可选行为选择器。
(4) 任何通用EF Core行为选择器,不针对数据库提供程序。services.AddDbContext 方法中参数Action<DbContextOptionsBuilder>来调用。
下面的示例将配置DbContextOptions使用SQL Server 提供程序,包含必要的数据库连接字符串connection变量、 提供程序级别的命令超时CommandTimeout,以及使用通用EF Core行为选择器UseQueryTrackingBehavior在执行的EF所有查询中不跟踪:
var connection = Configuration.GetConnectionString("BloggingDatabase");
services.AddDbContext<EFGetStartedAspNetCoreNewDbContext>
(options =>
{
//sqlServerOptions数据库提供程序级别的可选行为选择器
//UseQueryTrackingBehavior 为通用EF Core行为选择器
options.UseSqlServer(connection, sqlServerOptions =>
{
sqlServerOptions.EnableRetryOnFailure();
sqlServerOptions.CommandTimeout();
})
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
});
参考文献:
官方资料:ASP.NET Core 连接字符串
asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)的更多相关文章
- asp.net core系列 31 EF管理数据库架构--必备知识 反向工程
一. 反向工程 反向工程是基于数据库架构,生成的实体类和DbContext类代码的过程,对于Visual Studio开发,建议使用PMC.对于其他开发环境,请选择.NET Core CLI工具( ...
- asp.net core系列 30 EF管理数据库架构--必备知识 迁移
一.管理数据库架构概述 EF Core 提供两种主要方法来保持 EF Core 模型和数据库架构同步.一是以 EF Core 模型为基准,二是以数据库为基准. (1)如果希望以 EF Core 模型为 ...
- asp.net core 系列 20 EF基于数据模型创建数据库
一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种cod ...
- asp.net core 系列 21 EF现有数据库进行反向工程
一.概述 在上篇中使用EF基于数据模型创建数据库, 本篇继续使用 EF 基于数据库创建数据模型. 实现对已有数据库进行反向工程,来构建数据访问的 ASP.NET Core MVC 应用程序.已有 ...
- asp.net core系列 28 EF模型配置(字段,构造函数,拥有实体类型)
一. 支持字段 EF允许读取或写入字段而不是一个属性.在使用实体类时,用面向对象的封装来限制或增强应用程序代码对数据访问的语义时,这可能很有用.无法使用数据注释配置.除了约定,还可以使用Fluent ...
- asp.net core系列 35 EF保存数据(2) -- EF系列结束
一.事务 (1) 事务接着上篇继续讲完.如果使用了多种数据访问技术,来访问关系型数据库,则可能希望在这些不同技术所执行的操作之间共享事务.下面示例显示了如何在同一事务中执行 ADO.NET SqlCl ...
- asp.net core系列 34 EF保存数据(1)
一. 基本数据 每个EF上下文实例都有一个 ChangeTracker(更改跟踪器),它负责跟踪需要写入数据库的更改. 当更改实体类的实例时(修改属性,删除实例,新建实例等),这些更改会记录在 Cha ...
- asp.net core系列 33 EF查询数据 (2)
一. 原生SQL查询 接着上篇讲.通过 Entity Framework Core 可以在使用关系数据库时下降到原始 SQL 查询. 在无法使用 LINQ 表达要执行的查询时,或因使用 LINQ 查询 ...
- asp.net core系列 29 EF模型配置(查询类型,关系数据库建模)
一.查询类型 此功能是EF Core 2.1中的新功能. EF Core除了实体类型之外,EF Core模型还可以包含查询类型,这些查询类型是针对“未映射到实体类型”的数据获取.比如视图,或只读数据表 ...
随机推荐
- symfony简单的博客练习,熟悉具体开发流程
这里搭建一个简单的博客系统作为练习,之后再完成学校任务搭建一个表白墙, 使用htmlpurifier和parsedown来搭建前端,所以需要先安装这两个第三方包,必须要弄一个composer的国内镜像 ...
- CentOS7配置mailx使用外部smtp服务器发送邮件
转自huskiesir的博客: 发送邮件的两种方式: 1.连接现成的smtp服务器去发送(此方法比较简单,直接利用现有的smtp服务器比如qq.新浪.网易等邮箱,只需要直接配置mail.rc文件即可实 ...
- 光纤网卡与HBA卡区别
1.简介 光纤网卡 ,指的是光纤以太网适配器,简称光纤网卡,学名Fiber Ethernet Adapter.传输输的是以太网通信协议,一般通过光纤线缆与光纤以太网交换机连接.按传输速率可以分为100 ...
- Cause: java. lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider
相信现在Java Web开发都是用的mybatis吧,而用到mybatis很多人都不会错过通用mapper吧! (纯属瞎扯淡...qwq). 如我上一篇博客所写,目前公司新项目,使用了通用mapper ...
- console.log
其实,console.log 不仅仅有一下应用 console.log() 这个应该是最常用的 console.error() 输出错误信息 会以红色显示 console.assert(bool,”i ...
- ASP.NET MVC 网页应用 action 传递的Model
视图界面 @using {引用模型} @model {具体模型} <html> @Model.{具体模型的属性} </html> 注意区分Model的大小写 引入时,使用@mo ...
- Gradle 学习二
按照本指南,您将创建一个简单的Gradle项目,调用一些基本的Gradle命令,并了解Gradle如何管理项目 1.初始化项目创建项目目录 ❯ mkdir basic-demo ❯ cd basic- ...
- shuffle的工作原理
Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序.如果你不知道MapReduc ...
- post数据时报错:远程服务器返回错误: (400) 错误的请求。
网上查了多种方法,有不少说法,报400说是传的数据格式不对,最后的结论确实是数据格式不对. Content_Type为:application/json,配的数据格式有些麻烦,特别数多层,单层还好.例 ...
- Lua学习链接
Lua捕获 Lua中_G 是个什么鬼 Lua与ObjC的交互