5

実行時にのみ認識されるデータベースを移行しようとしています。つまり、パッケージ マネージャー コンソールを使用してデータベースを更新することはできません。また、それは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: 明確でない場合は、質問にさらに情報を追加できます。

4

3 に答える 3

4

私はいくつかの問題を抱えていました。解決策は次のとおりです。

1)Configurationパブリッククラスとして作成します:

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere>

2) Seed() メソッドを public にする

2) 以下のコードを任意の場所に追加します。これにより、最新の移行が適用され、データベースが更新されます。

Configuration configuration = new Configuration();
configuration.ContextType = typeof(YourContextClassHere);
var migrator = new DbMigrator(configuration);

// This will update the schema of the DB
migrator.Update();
// This will run Seed() method
configuration.Seed(new YourContextClassHere());
于 2013-07-04T09:17:36.000 に答える
2

Visual Studio およびパッケージ マネージャー コンソールの外部でデータベースを移行するには、EntityFramework nuget パッケージにある付属のmigrate.exeツールを使用します。基本的に、コマンド ラインから同じ移行を実行できます。

于 2012-04-26T13:55:03.550 に答える
1

でパッケージ マネージャー コンソールを使用できますUpdate-Database。接続文字列を指定するためのスイッチがあります。接続文字列自体 ($ConnectionStringおよび$ConnectionProviderName) または config から指定されたもの ( $ConnectionStringName) のいずれかです。

または、DbMigratorクラスを使用してコードで自分で処理することもできます (実際にmigrate.exe行っていることと同様)。

于 2012-04-27T10:04:05.600 に答える