7

Entity Framework Code First を使用して作成した Web アプリがあります。それを設定する際に、接続文字列の名前として DBContext の完全な名前空間とクラスを指定することで、DB 接続文字列を DBContext に一致させることができました。

<add name="MyClassProject.EfDbContext"  connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=MyDatabase;Integrated Security=true;User Id=MyUsername;Password=MyPassword;" providerName="System.Data.SqlClient"/>

最初にプロジェクトをセットアップしたとき、c:\inetpub\wwwroot にプロジェクトを作成し、Visual Studio で実行しました。すべてがうまくいきました。

今、コードを別の Web サイト フォルダーにビルドし、Web サイトを独自の Web サイトおよび IIS のアプリ プールとして実行しようとしています。Web サイトとホスト ファイルをセットアップしましたが、実行しようとすると次のエラーが表示されました。

ログインで要求されたデータベース「MyDatabase」を開けません。ログインに失敗しました。

ユーザー 'IIS APPPOOL\MyAppPool' のログインに失敗しました。

接続文字列でDBに使用するセキュリティユーザー名とパスワードを指定しているように見えるので、なぜこれが起こっているのか疑問に思っています....では、なぜ私のWebサイトが実行されているアプリプールとして接続しようとしているのでしょうか?

また、SQL Server で MyAppPool (または Network Service に変更した場合は Network Service) DB 権限を付与することなく、これを修正するにはどうすればよいですか?

更新:次を使用して DBContext クラスを初期化することを言及する必要がありました。

namespace MyClassProject 
{ 
    public class EfDbContext : DbContext 
    { 
        public EfDbContext() : base ("MyDatabase") 
        {
        }
    }
}
4

4 に答える 4

4

問題が見つかりました。DBContext クラスを で初期化すると: base("MyDatabase")、web.config で指定された接続文字列がオーバーライドされます。

データベースが既に存在する状態で、DBContext クラスからそれを削除すると、サイトは IIS で動作するようになりました。ただし、データベースをまだ作成していない場合 (またはデータベース初期化子を使用している場合、DropCreateDatabaseWhenModelChangesまたはDropCreateDatabaseAlwaysDB を再作成する必要がある場合)、SQL ユーザーを使用しようとするため、初期化子は失敗します。 DB を作成する権限がありません。

それを回避する私の方法は: base("MyDatabase")、データベースが作成されるように、最初に Visual Studio から実行して実行することです。次に、コードから削除し、指定されたユーザーを SQL Server の DB セキュリティに追加すると、その後 IIS でサイトを実行できるようになります。

于 2013-03-05T04:43:40.990 に答える
3

を削除しIntegrated Security=true;ます。これは、現在のユーザーをオフにする設定です。

于 2013-03-04T22:30:14.780 に答える
0

Web.config Transformを使用して、ローカル接続をリモートとは異なるものにすることができます (リリース モードなど)。使用を開始するには、Visual Studio からOne-Click Publishを使用して Web アプリを公開する必要があります。これは、Web アプリを公開する非常に便利な方法です。

それがあなたが探しているもののようです。


または、条件に基づいて接続文字列名を設定します。

public EfDbContext() : base (GetConnectionStringName())
{
}

private static GetConnectionStringName()
{
    return RunLocally() : "LocalDatabase" : "RemoteDatabase";
}

private static bool RunLocally()
{
   // implement some how
}
于 2013-03-05T04:58:25.137 に答える