日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

efcore根据多个条件更新_EF Core 基础知识

發(fā)布時間:2023/12/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 efcore根据多个条件更新_EF Core 基础知识 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
數(shù)據(jù)庫連接字符串

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

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

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

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

void ConfigureServices(IServiceCollection services)日志記錄

EF Core 默認(rèn)會與 ASP.NET Core的日志提供程序一起工作,只需要使用AddDbContext或AddDbContextPool添加服務(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中進(jìn)行配置:

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(options => options.UseSqlServer("",
providerOptions => providerOptions.EnableRetryOnFailure()));
}

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

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){
optionsBuilder
.UseMyProvider(
"",
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)檢查機(jī)制,可以幫助我們實(shí)現(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實(shí)例能,Options的作用如下:

  • 配置數(shù)據(jù)庫提供程序

  • 連接字符串

  • 數(shù)據(jù)庫提供程序級別的可選項

  • EF Core級別的可選項

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

public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions options)
: base(options){ }

public DbSet Blogs { get; set; }
}

也可以通過OnConfiguring方法進(jìn)行配置:

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

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

void ConfigureServices(IServiceCollection services)避免多線程操作

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

參考文檔

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

  • https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/connection-strings

  • https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/logging

  • https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/connection-resiliency

  • https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/configuring-dbcontext

作者:拓荒者

原文地址:

https://www.cnblogs.com/youring2/p/11144865.html

總結(jié)

以上是生活随笔為你收集整理的efcore根据多个条件更新_EF Core 基础知识的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。