web-dev-qa-db-ja.com

EF4コード-最初にInvalidOperationExceptionが発生します

プロジェクトをビルドするたびに実行しようとすると、問題が発生します。初期化子が実行されているように見えますが、最初のクエリになると、次の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 Code FirstCTP4を使用しています。 SQL Server 2008R2への接続

私がしたいのは、モデルの修正がある場合はデータベースを再作成し、ルックアップテーブルのいくつかの値をシードすることです。これらは両方とも、そのままでサポートされているようです*。

私の設定は次のようになります。

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だと知っているので、「サポートされている」というのはおそらくWordではないでしょう:)

28
Amadiere

答えが遅れていることは知っていますが、この投稿はグーグルで高く評価されており、答えは誰かに役立つかもしれません。問題は資格情報がないことです。これを防ぐには、接続文字列を次のように変更する必要があります。

Trusted_Connection=False;Persist Security Info=True

に基づく この記事

49
bizon

リクエストに応じて、コメントを回答として投稿しています。

私のソリューションは、Trusted_ConnectionとPersist Security Infoが修正を必要とするbizonと非常に似ていましたが、次の手順でVisualStudioのプロパティを使用して修正しました。

サーバーエクスプローラー-> 接続の変更-> 詳細->次に、セキュリティ情報の永続化TrustServerCertificate Trueとして、接続文字列を正しくフォーマットしました

screenshot of visual studio gui

6
Ben Anderson

VS2012とEF6で this をフォローしているときに、この問題が発生しました。私の解決策は非常に簡単です:

「リバースエンジニアリングコードファースト」を選択するとポップアップする[接続のプロパティ]ダイアログで、[パスワードを保存する]をオンにします。

問題は解決しましたが、詳細はわかりません...

5
ChandlerQ

これを接続文字列に追加します。それは私のために働いた。

Integrated Security=True;Persist Security Info=True;
3
akshay_mendki

パスワードが間違っていました。奇妙な言葉の例外。

0
Erik Bergstedt

これまでに投稿したことはなく、MVCを使用して、2010を使用し、データベースにSQL Server2005を実行する開発データベースサーバーを使用してEntityFrameworkを学習しました。私は主にWindowsアプリの人です。

チュートリアルの最初の部分はうまくいき、これまでに3つのテーブルを作成しました。その後、クラスをいくつか追加した後、上記のエラーが発生し、データベース構造を変更する必要がありました。

私の修正はかなり残酷でした、私は開発サーバーに行き、ログインに入りました、そして私は自分のサーバーのシステム管理者です、驚くことではありません。そこで、ユーザーマッピングに移動してマスターを選択し、すべてのボックスにチェックマークを付けました。現在は機能しています。

これがうまくいった理由や問題が何であるかはわかりませんが、私よりも多くのことを知っている誰かがこの「悪い修正」に基づいて構築し、この問題を抱えている他の人のためにそれを改善できることを願っています。

0
user1308816

これを思い通りに動作させることができませんでした。この答えはボッジ/オプトアウトであるため、何をすべきかを決定する際には注意してください。

それがより安定したバージョンになるまで、私はしばらくの間Code-Firstから離れました。 CTP4でもこの問題が発生している場合は、初期化子を失い、SetInitializerメソッドにNULLを渡すことで問題を回避できます。

Database.SetInitializer<CoreDB>(null);

これはもちろん、変更を加えるたびにデータベースを維持するか、1回の実行でデータベースを変更し、DBの作成後にデータベースを元に戻す必要があることを意味します。

0
Amadiere