実行時にのみ認識されるデータベースを移行しようとしています。つまり、パッケージ マネージャー コンソールを使用してデータベースを更新することはできません。また、それは1つだけではなく、多くのデータベースですが、それらすべてに対して同じスキーマです:)
オブジェクトに接続文字列を生成して挿入するために Ninject を使用していDbContext
ます。コンテキスト コンストラクターは次のようになります。
public class MyEntities : DbContext
{
public MyEntities(string database) : base(database) { }
/* Properties code omitted. */
}
コンテキストをインスタンス化する方法は次のとおりです。
public MyEntities GetDatabase(string databaseName, string connectionString)
{
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(connectionString);
builder.InitialCatalog = databaseName;
MyEntities context = this._kernel.Get<MyEntities>(new ConstructorArgument(
"database", builder.ConnectionString));
Database.SetInitializer<MyEntities>(
new MigrateDatabaseToLatestVersion<MyEntities, MyEntitiesMigrationConfiguration>("MyEntities"));
return context;
}
コンテキストが取得されると、メソッドは接続文字列を作成し、それをパラメーターとして のコンストラクターに渡しますMyEntities
。また、必要な移行のタイプをメソッドで指定します (この場合はMigrateDatabaseToLatestVersion
)。
移行コードは次のとおりです。
public partial class MyAccountInMonth : DbMigration
{
public override void Up()
{
AlterColumn("AccountsInMonths", "MovementDebtMonth", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "MovementCreditMonth", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "BalanceMonth", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "MovementDebtAccumulated", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "MovementCreditAccumulated", c => c.Long(nullable: false));
AlterColumn("AccountsInMonths", "BalanceAccumulated", c => c.Long(nullable: false));
}
public override void Down() { /* Code omitted */ }
}
アプリケーションを実行すると、次のエラーが発生します。
Cannot find the object "AccountsInMonths" because it does not exist or you do not have permissions.
移行によって、列のタイプがAccountsInMonths
からint
に変更されlong
ます。
スタック トレースに呼び出しがあるため、移行エラーです。現時点では、テーブルが存在するため、問題は権限にあるとしか考えられません。他の可能性は、接続文字列に何らかの問題があることです。お願いします、誰かこれの手がかりを持っていますか?前もって感謝します!
PS: 明確でない場合は、質問にさらに情報を追加できます。