<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      EF Core 基礎(chǔ)知識

      數(shù)據(jù)庫連接字符串

      在 ASP.NET Core 添加配置片段:

      {
        "ConnectionStrings": {
          "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
        }
      }
      

      然后,配置對應(yīng)的DbContext:

      public void ConfigureServices(IServiceCollection services)
      {
          services.AddDbContext<BloggingContext>(options =>
              options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
      }
      

      日志記錄

      EF Core 默認(rèn)會與 ASP.NET Core的日志提供程序一起工作,只需要使用AddDbContextAddDbContextPool添加服務(wù)即可。

      除此之外,還可以手工添加日志記錄。

      首先,創(chuàng)建LoggerFactory的單例:

      public static readonly LoggerFactory MyLoggerFactory
          = new LoggerFactory(new[] {new ConsoleLoggerProvider((_, __) => true, true)});
      

      然后,通過DbContextOptionsBuilder注冊此單例:

      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
          => optionsBuilder
              .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
              .UseSqlServer(
                  @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");
      

      如果你只想記錄想要的日志,例如數(shù)據(jù)操作語句,可以在ILoggerProvider中進行配置:

      public static readonly LoggerFactory MyLoggerFactory
          = new LoggerFactory(new[]
          {
              new ConsoleLoggerProvider((category, level)
                  => category == DbLoggerCategory.Database.Command.Name
                     && level == LogLevel.Information, true)
          });
      

      配置彈性連接

      EF Core 可以根據(jù)不同的數(shù)據(jù)庫失敗,制定不同的執(zhí)行策略,例如故障自動重試等。

      針對SQL Server,它知道可以重試的異常類型,并且具有合理的默認(rèn)值的最大重試,重試次數(shù)等之間的延遲。

      配置如下:

      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
          optionsBuilder
              .UseSqlServer(
                  @"Server=(localdb)\mssqllocaldb;Database=EFMiscellanous.ConnectionResiliency;Trusted_Connection=True;ConnectRetryCount=0",
                  options => options.EnableRetryOnFailure());
      }
      

      也可在Startup中配置:

      public void ConfigureServices(IServiceCollection services)
      {
          services.AddDbContext<PicnicContext>(
              options => options.UseSqlServer(
                  "<connection string>",
                  providerOptions => providerOptions.EnableRetryOnFailure()));
      }
      

      你也可以自定義執(zhí)行策略:

      protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
      {
          optionsBuilder
              .UseMyProvider(
                  "<connection string>",
                  options => options.ExecutionStrategy(...));
      }
      

      自動重試與事物

      對于執(zhí)行自動重試策略來說,每一次調(diào)用context.SaveChanges()方法將會當(dāng)做一個重試單元。如果你的事物中有多個SaveChanges操作,配置的自動重試策略將會拋出異常,解決方法是使用委托來手動調(diào)用執(zhí)行策略。代碼如下:

      using (var db = new BloggingContext())
      {
          var strategy = db.Database.CreateExecutionStrategy();
      
          strategy.Execute(() =>
          {
              using (var context = new BloggingContext())
              {
                  using (var transaction = context.Database.BeginTransaction())
                  {
                      context.Blogs.Add(new Blog {Url = "http://blogs.msdn.com/dotnet"});
                      context.SaveChanges();
      
                      context.Blogs.Add(new Blog {Url = "http://blogs.msdn.com/visualstudio"});
                      context.SaveChanges();
      
                      transaction.Commit();
                  }
              }
          });
      }
      

      此方法同樣適用于環(huán)境事物:

      using (var context1 = new BloggingContext())
      {
          context1.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/visualstudio" });
      
          var strategy = context1.Database.CreateExecutionStrategy();
      
          strategy.Execute(() =>
          {
              using (var context2 = new BloggingContext())
              {
                  using (var transaction = new TransactionScope())
                  {
                      context2.Blogs.Add(new Blog { Url = "http://blogs.msdn.com/dotnet" });
                      context2.SaveChanges();
      
                      context1.SaveChanges();
      
                      transaction.Complete();
                  }
              }
          });
      }
      

      自動重試策略需要考慮冪等性問題,防止數(shù)據(jù)添加重復(fù)等誤操作。EF Core 引入了一種狀態(tài)檢查機制,可以幫助我們實現(xiàn)是否執(zhí)行成功的檢測:

      using (var db = new BloggingContext())
      {
          var strategy = db.Database.CreateExecutionStrategy();
      
          var blogToAdd = new Blog {Url = "http://blogs.msdn.com/dotnet"};
          db.Blogs.Add(blogToAdd);
      
          strategy.ExecuteInTransaction(db,
              operation: context =>
              {
                  context.SaveChanges(acceptAllChangesOnSuccess: false);
              },
              verifySucceeded: context => context.Blogs.AsNoTracking().Any(b => b.BlogId == blogToAdd.BlogId));
      
          db.ChangeTracker.AcceptAllChanges();
      }
      

      DbContext配置項

      DbContext必須有DbContextOptions實例能,Options的作用如下:

      • 配置數(shù)據(jù)庫提供程序
      • 連接字符串
      • 數(shù)據(jù)庫提供程序級別的可選項
      • EF Core級別的可選項

      可以通過構(gòu)造函數(shù)添加Options:

      public class BloggingContext : DbContext
      {
          public BloggingContext(DbContextOptions<BloggingContext> options)
              : base(options)
          { }
      
          public DbSet<Blog> Blogs { get; set; }
      }
      

      也可以通過OnConfiguring方法進行配置:

      public class BloggingContext : DbContext
      {
          public DbSet<Blog> Blogs { get; set; }
      
          protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
          {
              optionsBuilder.UseSqlite("Data Source=blog.db");
          }
      }
      

      使用依賴注入DbContext時,需要構(gòu)造函數(shù)的方式進行配置,并在Startup中配置DbContext:

      public void ConfigureServices(IServiceCollection services)
      {
          services.AddDbContext<BloggingContext>(options => options.UseSqlite("Data Source=blog.db"));
      }
      

      避免多線程操作

      EF Core 提供了async/await操作,但是這是一個語法糖,它并不支持并行操作,這是由于數(shù)據(jù)庫連接的特性限制的,因此我們應(yīng)避免針對同一個Context執(zhí)行任何并行操作。

      參考文檔

      參考微軟 EF Core 使用文檔,詳情:

      posted @ 2019-07-07 00:47  拓荒者IT  閱讀(2300)  評論(1)    收藏  舉報
      皮膚配置 參考地址:https://www.yuque.com/awescnb/user
      主站蜘蛛池模板: 中文字幕人妻精品在线| 日韩av在线一区二区三区| 欧美肥老太牲交大战| 日本边添边摸边做边爱| 久久精品蜜芽亚洲国产AV| 欧美人成精品网站播放| 亚洲天堂精品一区二区| 夜夜爽妓女8888888视频| 成人无码区在线观看| 国产亚洲一区二区三不卡| 亚洲欧美中文日韩V日本| 福利一区二区在线观看| 成人av久久一区二区三区| 日韩一区二区三在线观看| 熟妇无码熟妇毛片| 91精品91久久久久久| 黄色大全免费看国产精品| 麻豆成人av不卡一二三区| 国产成人精品日本亚洲直播| 亚洲av色在线播放一区| 无码高潮爽到爆的喷水视频app| 午夜成人精品福利网站在线观看| 在线播放亚洲成人av| 黄色三级亚洲男人的天堂| 巨胸美乳无码人妻视频漫画| 久久中文骚妇内射| 激情在线一区二区三区视频| 依依成人精品视频在线观看| 中文人妻无码一区二区三区在线| 亚洲av第二区国产精品| 无码专区 人妻系列 在线| 亚洲国产理论片在线播放| 尤物yw193无码点击进入| 中文字幕人妻av12| 成人免费A级毛片无码网站入口| 99久久国产综合精品成人影院| 欧美丰满熟妇性xxxx| 亚洲一区二区偷拍精品| 极品尤物被啪到呻吟喷水| 欧美激情 亚洲 在线| 亚洲国产在一区二区三区|