一.連接字元串 在上二篇中,ASP.NET Core 應用程式連接字元串是寫死在ConfigureServices代碼中,下麵介紹通過配置來實現。連接字元串可以存儲在 appsettings.json、用戶機密存儲、其他配置源中。 下麵示例演示appsettings.json 中存儲的連接字元串,這 ...
一.連接字元串
在上二篇中,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(60); }) .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); });
參考文獻:
官方資料:ASP.NET Core 連接字元串