1

私は、Entity Framework 6.1.3コードファーストを使用し、SQL Express Management Studio 2014を使用してWebアプリケーションを作成しています。 私のアプリケーションが成長するたびにDBを更新するために移行を使用しています。それは素晴らしいと私自身のデータベースで非常に良い作品。しかし、私はこのアプリケーションを運用サーバーに置くつもりですが、アプリケーションを実行している間に2人の異なるユーザー、db構造体とdb_read/writeエンドユーザーを変更できるdb_ownerユーザーを使用したいと考えています。 これには2つのオプションがありました。移行が必要なときに別のconnectionStringを使用する

1)必要なユーザーを指定する2つのweb.configファイルを使用しています。このようにして、私が移行を行うたびに、まずdb_ownerビルドを実行し、更新後にdb_read/writeを再度展開します。

2)保留中の移行があることをアプリケーションに知らせる方法を見つけ、最初にをdb_ownerユーザーに接続し、ユーザーを切り替えて実行を続行します。

第2の選択肢は明らかです。

周りを見る私は私のために働いていないいくつかのものを見つけました。私はweb.config file:

<add name="UserWithPrivilegesConnectionString" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=MyDb-test; Persist Security Info=True; MultipleActiveResultSets=True; User ID=userWithPrivileges; Password=pass" providerName="System.Data.SqlClient" /> 
<add name="RandomUserConnectionString" connectionString="Data Source=.\SQLEXPRESS; Initial Catalog=MyDb-test; Persist Security Info=True; MultipleActiveResultSets=True; User ID=user; Password=pass" providerName="System.Data.SqlClient" /> 

に追加しました

はその後myInitializer.cs

class myInitializer : System.Data.Entity.MigrateDatabaseToLatestVersion<MyDbContext, Configuration> 
public override void InitializeDatabase(MyDbContextcontext) 
    { 
     try 
     { 
      context.SetConnectionString(System.Configuration.ConfigurationManager.ConnectionStrings["RandomUserConnectionString"].ConnectionString); 
      if (!context.Database.Exists() || !context.Database.CompatibleWithModel(false)) 
      { 
       var configuration = new Configuration(); 
       var migrator = new DbMigrator(configuration); 
       configuration.TargetDatabase = new DbConnectionInfo(System.Configuration.ConfigurationManager.ConnectionStrings["UserWithPrivilegesConnectionString"].ConnectionString, "System.Data.SqlClient"); 
       var migrations = migrator.GetPendingMigrations(); 
       if (migrations.Any()) 
       { 
        var scriptor = new MigratorScriptingDecorator(migrator); 
        string script = scriptor.ScriptUpdate(null, migrations.Last()); 
        if (!String.IsNullOrEmpty(script)) 
        { 
         context.Database.ExecuteSqlCommand(script); 
        } 
       } 
      } 
      base.InitializeDatabase(context); 

どこcontext.Database.ExecuteSqlCommand(script);実行中に、私が取得:

Exception thrown: 'System.Data.Entity.Core.EntityException' in EntityFramework.SqlServer.dll 
Additional information: The underlying provider failed on Open. 

理由はまだそのコンテキストある 〜を持つ内部のRandomUserConnectionStringは変更できません。私はコンテキストのためにsetConnectionStringメソッドを追加しようとしましたが、方法はありません。 私はまたmyInitializer.cs

var configuration = new Configuration(); 
      var migrator = new DbMigrator(configuration); 
      configuration.TargetDatabase = new DbConnectionInfo(System.Configuration.ConfigurationManager.ConnectionStrings["UserWithPrivilegesConnectionString"].ConnectionString, "System.Data.SqlClient"); 
      var migrations = migrator.GetPendingMigrations(); 
      if (migrations.Any()) 
      { 
       migrator.update(); 
      } 
     } 
     base.InitializeDatabase(context); 

何もまだ、別のアプローチを試みました。また、closeStringを設定して、明示的に接続をオープンしようとしました。

FYI、MyDbContext

public MyDbContext() : base("name=UserWithPrivilegesConnectionString") 
    { 
     Configuration.LazyLoadingEnabled = false; 
    } 


    public MyDbContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 
     //disable initializer if necessary 
     Configuration.LazyLoadingEnabled = false; 
    } 

だったと今、私は最初のベースのコンストラクタから引数を削除しました。

アイデア?

+0

これについてはわかりません。代わりにrandomUserConnectionStringを使用する必要があるときにアプリケーションが認識する方法 – Kernel

+0

申し訳ありませんが、私は非常に良いエラーメッセージを読んでいない!基礎となるプロバイダがOpenで失敗しました。 –

+0

マイグレーションスクリプトを使用して、非開発データベースを更新します。 http://cpratt.co/migrating-production-database-with-entity-framework-code-first/ –

答えて

0

デフォルトでは、EFマイグレーションはDbContextで使用するのと同じ接続文字列を使用しますが、DbMigrationsConfigurationサブクラスで変更することができます(設定と呼ばれ、プロジェクトでマイグレーションを有効にするとMigrationsフォルダに作成されます)。コンストラクタで は、ちょうど追加:

TargetDatabase = new DbConnectionInfo(ConfigurationManager.ConnectionStrings["UserWithPrivilegesConnectionString"].ConnectionString, "System.Data.SqlClient"); 

今、あなたの移行は、この接続文字列を使用すると、あなたのアプリケーションを使用すると、コンストラクタで渡すものは何でも、接続文字列を使用します。

Database Initializerに関して、私は通常MigrateDatabaseToLatestVersionを使用しませんが、何もカスタマイズせずに必要な作業を行うと思います。

Webアプリケーションのライブ環境を管理している場合は、マイグレーションからSQLスクリプトを生成し、ライブDBに手動で適用する方が安全だと思います。このようにして、生成されたスクリプトを微調整することができます。これは、データで既存のテーブルを大幅に変更する必要がある場合に特に便利です。

関連する問題