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模型还可以包含查询类型,这些查询类型是针对“未映射到实体类型”的数据获取.比如视图,或只读数据表 ...
随机推荐
- 2018年多校第三场第一题 A. Ascending Rating hdu6319
比赛地址:http://acm.hdu.edu.cn/contests/contest_show.php?cid=804 题目编号:第一题 A. Ascending Rating hdu6319 题 ...
- hdu1201 java
题意: 求某人从出生到18岁生日所经过的天数.如果这个人没有18岁生日,就输出-1. 思路: 通过毫秒值计算天数. 利用:来自https://www.cnblogs.com/xiohao/p/5294 ...
- Centos6下使用yum安装MariaDB
1)增加mariaDB的yum源 1 2 3 4 5 6 7 8 9 [root@centos6-test08 ~]# cd /etc/yum.repos.d/ [root@centos6-test0 ...
- tf.contrib.slim.data数据加载 综述
TF-Slim为了方便加载各种数据类型(如TFRocords或者文本文件)的数据,创建了这个库. Dataset 这里的数据库与通常意义下数据库是不同的,这里数据库是python一个类,它负责将原始数 ...
- [LeetCode] Binary Gap 二进制间隙
Given a positive integer N, find and return the longest distance between two consecutive 1's in the ...
- node.js 递归复制文件夹(附带文件过滤功能)
1.简介: 很简单,写了一个node操作文件的小脚本,主要实现对目标文件夹中内容的复制.还顺带一个按照文件夹或者文件名过滤的功能. 2.应用场景 适合基于 node 环境的项目,项目打包的时候,配合 ...
- 你不知道的JS之作用域和闭包(四)(声明)提升
原文:你不知道的js系列 先有鸡还是先有蛋? 如下代码: a = 2; var a; console.log( a ); 很多开发者可能会认为结果会输出 undefined,因为 var a 在 a ...
- 对于bilibili主页head部分的代码的总结以及疑问。
1.lang=zh-Hans: lang代表languages的意思,VSCode创建出来的网页模板是lang=en,en代表english的意思,zh代表中文,单一的zh是废弃的语法,Hans代表中 ...
- 【转载】.NET压缩/解压文件/夹组件
转自:http://www.cnblogs.com/asxinyu/archive/2013/03/05/2943696.html 阅读目录 1.前言 2.关于压缩格式和算法的基础 3.几种常见的.N ...
- c++ 之bind使用
网络编程中, 经常要使用到回调函数. 当底层的网络框架有数据过来时,往往通过回调函数来通知业务层. 这样可以使网络层只专注于 数据的收发, 而不必关心业务 在c语言中, 回调函数的实现往往通过函数指针 ...