実行時にのみ認識されるデータベースを移行しようとしています。つまり、パッケージマネージャコンソールを使用してデータベースを更新できません。また、単なるデータベースではありませんが、すべてのデータベースで同じスキーマです。エンティティフレームワークコードファースト:ランタイムでのみ認識されるデータベースを移行する
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.
何移行がないことlong
にint
から列AccountsInMonths
の種類を変更しています。
スタックトレースに呼び出しがあるため、移行エラーです。現時点では、テーブルが存在するため、問題は権限であるとしか考えられません。他の可能性は、接続文字列にある種の問題です。誰かがこれの手掛かりを持っていますか?前もって感謝します!
PS:明確でない場合は、質問にさらに情報を追加できます。
SQL Azureデータベースでこれを行うことはできますか? – jmpcm
試したことがありません。それでも。私は、Sql Serverのばらつきから期待しています。 –
@jmpcmはいできます。 –