以下のカスタム DatabaseInitialiser があります
/// <summary>
/// Implements the IDatabaseInitializer to provide a custom database initialisation for the context.
/// </summary>
/// <typeparam name="TContext">TContext is the DbContext</typeparam>
public class ParikshaDataBaseInitializer<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext
{
/// <summary>
/// The method to Initialise the database.
/// Takes care of the database cannot be dropped since it is in use problem while dropping and recreating the database.
/// </summary>
/// <param name="context">The DbContext on which to run the initialiser</param>
public void InitializeDatabase(TContext context)
{
var exists = context.Database.Exists();
try
{
if (exists && context.Database.CompatibleWithModel(true))
{
// everything is good , we are done
return;
}
if (!exists)
{
context.Database.Create();
}
}
catch (Exception)
{
//Something is wrong , either we could not locate the metadata or the model is not compatible.
if (exists)
{
context.Database.ExecuteSqlCommand("ALTER DATABASE Pariksha SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
context.Database.ExecuteSqlCommand("USE Master DROP DATABASE Pariksha");
context.SaveChanges();
}
context.Database.Create();
}
}
}
上記のコードについての何かは単なるハック以上のものです (助けを借りて自由に参加してください)
次に、移行を追加し、移行スクリプトも正しく機能するようにしました。
internal sealed class Configuration : DbMigrationsConfiguration<ParikshaContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
ContextKey = "EFRepository.Context.ParikshaContext";
}
protected override void Seed(ParikshaContext context)
{
}
}
移行は期待どおりに機能します。
さて、質問は私のアプリケーションの起動時に何をすべきですか? このようなもの
var config = new Configuration();
var migrator = new DbMigrator(config);
migrator.Update();
また、一部のフォーラムでは、コンテキストを使用するたびにデータベースとスキーマが正しいかどうかを確認したくないため、少し奇妙に思えるコンストラクターでもこれを提案しました。それで、このテクニックの可能な使用法は何ですか、または提案のコンテキストが間違っていると思いましたか?
public ParikshaContext() : base("Pariksha")
{
Database.SetInitializer(new ParikshaDataBaseInitializer<ParikshaContext>());
}
要約すると、
利用可能なさまざまな手法の正しいユースケースは何ですか?
移行がすべての条件で機能し、データベースをある環境から別の環境に移動するときに理想的な戦略は何でしょうか?