天天看點

asp.net core 系列 22 EF(連接配接字元串,連接配接複原,DbContext)

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遷移介紹

設定連接配接複原      

posted on 2019-02-14 09:47 花陰偷移 閱讀(...) 評論(...) 編輯 收藏