私は、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;
}
だったと今、私は最初のベースのコンストラクタから引数を削除しました。
アイデア?
これについてはわかりません。代わりにrandomUserConnectionStringを使用する必要があるときにアプリケーションが認識する方法 – Kernel
申し訳ありませんが、私は非常に良いエラーメッセージを読んでいない!基礎となるプロバイダがOpenで失敗しました。 –
マイグレーションスクリプトを使用して、非開発データベースを更新します。 http://cpratt.co/migrating-production-database-with-entity-framework-code-first/ –