28

プロジェクトをビルドするたびに実行しようとすると、問題が発生します。イニシャライザーは実行されているようですが、最初のクエリに関しては、次のように終了します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だと知っているので、「サポートされている」という言葉はおそらくないでしょう:)

4

7 に答える 7

49

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

Trusted_Connection=False;Persist Security Info=True

この記事に基づく

于 2011-03-28T23:09:14.120 に答える
6

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

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

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

VisualStudioGUIのスクリーンショット

于 2014-01-21T16:18:31.080 に答える
5

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

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

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

于 2013-06-05T06:28:06.367 に答える
3

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

Integrated Security=True;Persist Security Info=True;
于 2015-12-07T14:52:36.217 に答える
0

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

より安定したバージョンになるまで、しばらくの間、Code-Firstから元に戻しました。CTP4でもこの問題を抱えている人は、初期化子を失い、SetInitializerメソッドにNULLを渡すことで、この問題を回避できます。

Database.SetInitializer<CoreDB>(null);

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

于 2010-12-02T08:25:44.370 に答える
0

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

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

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

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

于 2012-09-16T11:13:38.150 に答える
0

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

于 2016-05-03T12:22:54.223 に答える