一.连接字符串
在上二篇中,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();

