asp.net core 系列 22 EF(连接字符串,连接复原,DbContext)

时间:2022-06-14 04:25:22

一.连接字符串

  在上二篇中,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 连接复原

           ASP.NET Core 配置 DbContext

          migrations迁移介绍