2012-04-26 5 views
3

実行時にのみ認識されるデータベースを移行しようとしています。つまり、パッケージマネージャコンソールを使用してデータベースを更新できません。また、単なるデータベースではありませんが、すべてのデータベースで同じスキーマです。エンティティフレームワークコードファースト:ランタイムでのみ認識されるデータベースを移行する

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. 

何移行がないことlongintから列AccountsInMonthsの種類を変更しています。

スタックトレースに呼び出しがあるため、移行エラーです。現時点では、テーブルが存在するため、問題は権限であるとしか考えられません。他の可能性は、接続文字列にある種の問題です。誰かがこれの手掛かりを持っていますか?前もって感謝します!

PS:明確でない場合は、質問にさらに情報を追加できます。

答えて

2

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

+0

SQL Azureデータベースでこれを行うことはできますか? – jmpcm

+0

試したことがありません。それでも。私は、Sql Serverのばらつきから期待しています。 –

+0

@jmpcmはいできます。 –

1

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

またはDbMigratorクラスを使用すると、コードで実際に処理することができます(実際はmigrate.exeと同様)。

+0

私は開発段階にあるので、今は良い解決策です。しかし、もしそれが将来起こるなら、それはアクセスのための1つのデータベースがあるので(実現することができない)、多くの人々がアクセスしていることを望む。たとえば、1000回のアクセスでは1000個のデータベースがあり、ソリューションは最適ではありません。しかし、今は良い提案です:)ありがとう! – jmpcm

+0

@jmpcm私の答えに 'DbMigrator'クラスに関する注釈を追加しました。多分それはバッチでそれを行うのに役立つかもしれません。 –

2

私はいくつかの問題がありました。

1)publicクラスとしてあなたConfigurationを行います:公共

2として

public sealed class Configuration : DbMigrationsConfiguration<YourContextClassHere> 

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()); 
+0

提案に感謝します!この問題は、私の古い会社のプロジェクトで作業していたときに発生しました。残念ながら私はあなたが提案するこのアプローチを試すことができないので、私は同じ問題を抱えている人にそれを公開させます! – jmpcm

関連する問題