データベースを作成する前にマイグレーションツール"dotnet ef database update"
が私のアプリケーションBuildWebHost
を実行していることを前提に、マイグレーションを使用している間にデータベースにアクセスする必要のあるサービスを構築するにはどうすればよいですか?データベースが必要なサービスを構成しようとすると、データベースが存在せず、移行コマンドが失敗するため、例外がスローされます。したがって、データベースは決して作成されません。データベースを必要とする移行とサービスがありますか?
私は空のデータベースで"dotnet ef database update"
を実行し、より具体的にはasp.netコア2とEFコア2
を使用していると、次のエラーで失敗します。私が構築しているので、
An error occurred while calling method 'BuildWebHost' on class 'Program'.Continuing without the application service provider. Error: Cannot open database "MyDb" requested by the login. The login failed. Login failed for user 'MYCOMPUTER\MYNAME'.
これが起こりますこのMicrosoft Configuration Tutorial私のProgram.csの通り(カスタムオプションのクラスでそれへの結合の最終的な目標と)私の「MYDB」データベースに裏打ちされたカスタム設定プロバイダは、次のようになります。
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((builderContext, config) =>
{
var tmpconfig = config.Build();
config.AddMyOptionsConfig(options => options.UseSqlServer(tmpconfig.GetConnectionString("My_Database")));
})
.UseStartup<Startup>()
.Build();
とAddMyOptionsConfigは最終的に実行されます。データベースがまだ作成されていないので、それがデータベースにアクセスしようとしたときにSQLException
をスロー
public class EFConfigProvider : ConfigurationProvider
{
[...]
// Load config data from EF DB.
public override void Load()
{
var builder = new DbContextOptionsBuilder<MyDbContext>();
OptionsAction(builder);
using (var dbContext = new MyDbContext(builder.Options))
{
// dbContext.Database.EnsureCreated(); // will cause first migration to fail
Data = !dbContext.ConfigurationValue.Any() // throws exception
? CreateAndSaveDefaultValues(dbContext)
: dbContext.ConfigurationValue.ToDictionary(c => c.Id, c => c.Value);
を。
ただし、dbContext.Database.EnsureCreated()
を使用しようとすると、テーブルがすでに存在するため、最初の移行が失敗します。代わりにdbContext.Database.Migrate()
を試してみることを考えましたが、初心者としては、プロダクション環境に意図しない結果が生じる可能性があると私は心配しています。そのため、私はコマンドラインツールを使って移行を制御する方が好きです。
基本的には、データベースを作成する前に、BuildWebHost
の"dotnet ef database update"
がアプリケーション起動を実行していますが、BuildWebHost
に追加されたカスタム設定プロバイダは、データベースが既に存在する必要があります。
このジレンマを解決するにはどうすればよいですか?
1は動作しますが、コードが正常に実行されていると、伝搬されるべき例外を飲み込む可能性があります。 – pere57
それは "より複雑な"ものが入ってくるだろう。私はこれを自分で試していないが、HttpContextのようなものを提供する可能性がある。これは実際には "実行中の移行"シナリオと実際には非常に異なる要求に応答します。重要な点は、マイグレーションプロセスの一環としてコードが実行されないようにすることです。 –
私は[このドキュメント](https://docs.microsoft.com/en-us/ef/core/miscellaneous/cli/dbcontext-creation)から、2と同じ効果を達成できることを認識しましたが、別のプロジェクトは必要ありませんBuildWebHostの名前を変更します。 IDesignTimeDbContextFactoryは、最も一般的なソリューションのように見えます。私のデータベース接続文字列がユーザーの秘密であり、そのための構成にはIWostingEnvironmentが必要です.IHostingEnvironmentはBuildWebHostの外部では利用できません。私はそれを構成する別の方法があると確信しています。 – pere57