データベース接続文字列
configureフラグメントASP.NETコアを追加します:
{
"ConnectionStrings": {
"BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;"
}
}
その後、DbContextを対応する設定:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase")));
}
ロギング
で動作するようにASP.NETコアロギングプログラムをデフォルトで提供EFコアは、あなただけが使用する必要があるAddDbContext
か、AddDbContextPool
サービスを追加します。
また、あなたはまた、手動でログを追加することができます。
まず、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");
あなたは、このようなデータ操作文として、欲しかっログインしたい場合は、中ILoggerProviderで設定することができます。
public static readonly LoggerFactory MyLoggerFactory
= new LoggerFactory(new[]
{
new ConsoleLoggerProvider((category, level)
=> category == DbLoggerCategory.Database.Command.Name
&& level == LogLevel.Information, true)
});
弾性連結
別のデータベースによるEFコアは、そのようなので、上の自動リトライ障害となど、さまざまな実行戦略を開発するために失敗します。
SQL Serverの場合は、例外の種類を再試行することができます知っており、最大再試行合理的なデフォルト、再試行回数の間の遅延を持っています。
以下のような構成は以下のとおりです。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=EFMiscellanous.ConnectionResiliency;Trusted_Connection=True;ConnectRetryCount=0",
options => options.EnableRetryOnFailure());
}
スタートアップの中に配置することができます。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<PicnicContext>(
options => options.UseSqlServer(
"<connection string>",
providerOptions => providerOptions.EnableRetryOnFailure()));
}
また、実行ポリシーをカスタマイズすることができます。
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseMyProvider(
"<connection string>",
options => options.ExecutionStrategy(...));
}
自動再試行との事
各コールの自動再試行戦略のためのcontext.SaveChanges()
方法のユニットとして再試行されます。あなたが複数のもののSaveChanges操作を持っている場合は、自動再試行ポリシー設定は、例外がスローされます、ソリューションを手動で実行ポリシーを呼び出すためにデリゲートを使用することです。コードは以下の通りであります:
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();
}
}
});
}
この方法はまた、適用される環境のことです。
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();
}
}
});
}
自動再試行戦略は、電力などの問題を考慮する必要があり、データが重複誤用を防ぐために添加されます。EFコアは、状態検査機構を導入して、私たちがするかどうかを検出することに成功を達成するのを助けることができます。
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たとえば、次のような効果のオプションが存在することができます:
- 設定データベース・プロバイダー
- 接続文字列
- データベースプロバイダレベルのオプション
- EFコアレベルのオプション
オプションは、コンストラクタを介して追加することができます。
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の依存性注入を使用する場合、このアプローチは起動DbContextに構成および配置されたコンストラクタが必要です。
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<BloggingContext>(options => options.UseSqlite("Data Source=blog.db"));
}
マルチスレッド化を避けます
EFコア/非同期を提供して操作を待つが、これは、それが原因のデータベース接続の制限の特性に、並列演算をサポートしていないので、私たちは同じコンテキストのために任意の並列演算を実行することは避けてください、シンタックスシュガーです。
参考資料
参考マイクロソフトEFコアは、詳細はドキュメントを使用しています。