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(60);
                    })
                    .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
                });

 

 

 參考文獻:

    官方資料:ASP.NET Core 連接字符串

           ASP.NET Core 連接復原

           ASP.NET Core 配置 DbContext

           migrations遷移介紹

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM