プロジェクトをビルドするたびに実行しようとすると、問題が発生します。イニシャライザーは実行されているようですが、最初のクエリに関しては、次のように終了しますInvalidOperationException
。
This operation requires a connection to the 'master' database. Unable to create a
connection to the 'master' database because the original database connection has
been opened and credentials have been removed from the connection string. Supply
an unopened connection.
参考までに、NuGetで直接インポートされたEF CodeFirstCTP4を使用しています。SQL Server2008R2への接続
私がしたいのは、モデルの修正がある場合はデータベースを再作成し、ルックアップテーブルのいくつかの値をシードすることです。これらは両方とも、箱から出してすぐにサポートされるようです*。
私のセットアップは次のようになります。
Global.asax
protected void Application_Start()
{
Database.SetInitializer<CoreDB>(new CoreDBInitialiser());
// et al...
}
CoreDB.cs
public class CoreDB : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Login> Logins { get; set; }
public DbSet<Permission> Permissions { get; set; }
public DbSet<Role> Roles { get; set; }
public DbSet<RolePermission> RolePermissions { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
public DbSet<Setting> Settings { get; set; }
}
public class CoreDBInitialiser : RecreateDatabaseIfModelChanges<CoreDB>
{
protected override void Seed(CoreDB context)
{
var settings = new List<Setting>
{
new Setting
{
SettingName = "ExampleSetting",
SettingValue = "This is a sample setting value",
}
};
settings.ForEach(d => context.Settings.Add(d));
}
}
実行すると、これと同様の行で停止します。これは、基本的に、データベースの作成後に最初に検出されるクエリです。
User data = (from u in _data.Users where u.Username == userName select u).SingleOrDefault();
私がそうは思わないこと:
- 権限ではありません:SQLServer内の実際のデータベース自体を削除しました。アプリケーションは、クエリの実行が試行されるのとほぼ同時にそれを再作成します(初期化子が設定され、必要になるまで作成を保留することは明らかです)。また、Web.configで指定されたユーザーとしてSQL Serverにログオンし、データベースへの完全な読み取り/書き込みアクセス権を持っています。実際、そのアカウントがデータベースも作成するので、おそらく彼らはそうすべきです。
- データベースが作成されています:DBを削除すると、自動的に正常に再作成されます。
providerName
接続文字列は、属性を含めて正しく定義されています。
<add name="CoreDB" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TheDatabase;User Id=TheUsername;Password=ThePassword;" providerName="System.Data.SqlClient" />
- クエリが正常に失敗すると、次にアプリケーションが再構築されるまでコードが正しく開始されるため、コード/ロジックのバグではないようです。それは明らかに可能性があり、とにかく何があってもコードに回避策を適用する必要があるでしょう。:)
何をすべきか?
理想的には、「データベーススキーマについてはあまり考えない」ことです。Scott Guの優れたブログ投稿(および既存のデータベースでの作業のフォローアップ)にあるように、問題が解決して消えてしまったようにしたいと思います。ほとんどの場合、これは真実です。ある時点で接続が閉じられないという問題のようですが、この問題を修正する方法がわかりません。
いくつかのフォーラム/SOの投稿は、私が抱えている問題が基本的にイニシャライザーが計画どおりに機能しておらず、接続が開いたままになっている可能性があることを示唆しています。他の場所での解決策は、単に「独自の初期化子を作成しない」ことであるように見えます。これは最大の解決策ではありませんが、誰かがアイデアを持っていない限り、おそらくCTP5までやらなければならないでしょう。
*うん、それはCTPだと知っているので、「サポートされている」という言葉はおそらくないでしょう:)