N DataContexts を持つはずのプロジェクトを構築しています。App-Start (Global.asax) で以下の手順を実行する Web アプリケーションがあります。
1 - データベースが存在しない場合は、作成します。2 - データベースを最新の移行に更新します。
アプリケーションを初めて実行すると (データベースはまだ作成されていません)、「ログインによって要求されたデータベース "DBName" を開けません。ログインに失敗しました。ユーザー 'sa' のログインに失敗しました。」というエラー メッセージが表示されます。
わかりましたので、現時点でデータベースを確認すると作成されますが、__Migrations テーブルはありません。
アプリケーションを停止して再度実行すると、例外はスローされず、データベースは正常に更新されます。
接続文字列に永続的なセキュリティ情報を設定しようとしましたが、何も変わりません。
私のコードは以下です: Global.asax
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
Bll.AppStart.Databases.Start();
}
呼び出し中..
namespace BusinessLogicLayer.AppStart
{
/// <summary>
/// Inicialização e Update de versão dos bancos de dados do sistema
/// </summary>
public static class Databases
{
public static void Start()
{
//Iniciar DBCore
DataBaseStart<DataAccessLayer.DataContexts.Core.Context,
DataAccessLayer.Migrations.Core.Configuration>();
}
#region Inicializar bancos de dados
private static void DataBaseStart<T, TC>()
where T : DbContext, new()
where TC : DbMigrationsConfiguration<T>, new()
{
//Atualiza a base de dados com base na configuração do migrations
try
{
var migratorConfig = new TC();
var dbMigrator = new DbMigrator(migratorConfig);
dbMigrator.Configuration.AutomaticMigrationDataLossAllowed = false;
dbMigrator.Update();
}
catch (Exception)
{
//Exceção quando cria o banco a primeira vez?
throw new Exception("Banco de dados criado pela primeira vez. Reinicie a aplicação.");
}
}
#endregion
}
}
私のコンテキストクラス..空のデータベースを定義していることに注意してください
public class Context : DbContext
{
public Context()
{
Database.Connection.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["PODBCore"].ConnectionString;
}
public Context(string connectionString)
{
Database.Connection.ConnectionString = connectionString;
}
}
私の移行構成クラス
public sealed class Configuration : DbMigrationsConfiguration<DataContexts.Core.Context>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
}
protected override void Seed(DataContexts.Core.Context context)
{
// This method will be called after migrating to the latest version.
}
}
空のモデルを定義する初期移行があります
public partial class Initial : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
覚えておいてください、アプリケーションを2回実行すると、データベースが正常に作成および更新されます(他の移行でテストし、テーブルなどを作成しました)。例外は、アプリケーションが初めて実行されたときにのみスローされ、データベースは存在しません。
また、移行更新コードを実行する前に、Database.SetInitializer と context.CreateIfNotExist() を呼び出そうとしました。
編集:
SQL Server ログを確認しました。基本的に、アプリケーションは接続文字列で指定された初期カタログに接続しようとしていますが、存在しません。ただし、例外がスローされた後、データベースが作成されてオンラインになります。
編集:
Initial Catalog プロパティを削除すると機能しますが、すべての dataContexts が master データベースにテーブルを作成することになります。
N 個のサーバー インスタンスを使用することもできますが、コンテキスト間には何らかの分離がありますが、同じ SQL インスタンスでコンテキストごとに 1 つのカタログを取得しようとしています。