7

私はEntity Framework Code Firstを使用して作成したWebアプリケーションを持っています。それを設定する際には、接続文字列の名前としてDBContextの完全な名前空間とクラスを指定することで、DB接続文字列を自分のDBContextに一致させることができました。 エンティティフレームワークコード最初にIISを使用して接続文字列を無視

<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サイトをIISの独自のWebサイトとアプリケーションプールとして実行しようとしています。私はウェブサイトとホストファイルを設定しましたが、実行すると次のエラーが発生しました。

ログインで要求されたデータベース "MyDatabase"を開くことができません。ログインに失敗しました。

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

私は接続の文字列でDBに使用するセキュリティのユーザ名とパスワードを指定しているようですが、どうしてこんなことが起こっているのでしょうか?私のウェブサイトは動いていますか?

また、SQL ServerでMyAppPool(またはそれを変更した場合はネットワークサービス)のDB権限を与えなくても、これをどのように修正できますか?

アップデート:私は、私が使用して私のDBContextクラスを初期化することを述べてきたはずです

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

答えて

3

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

+0

接続文字列からその属性を削除しましたが、引き続き同じ問題があります。私は明示的にIntegrated Security = falseを設定しようと試みました。しかしそれはどちらもうまくいかなかった。 –

+1

@SeanHolmesbyあなたはその接続文字列を使用していますか? –

+0

Visual Studioを実行すると(動作しているとき)、参照しようとしているデータベースにデータが確実に追加されます。 私が持っている: - 名前空間MyClassProject {publicクラスEfDbContext:DbContext {パブリックEfDbContext() ベース( "MyDatabaseという") {}} } ......そして次のようになります。

3

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

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

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

+1

'base(" MyDatabase ")は、Web.configの接続文字列名を意味します。したがって、異なる展開ポイントに対して異なる接続文字列を設定するだけで済みます。または、条件に異なる名前のベースを設定します。 – abatishchev

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 
} 
1

統合セキュリティを使用する場合は、DBは、現在のプロセスを実行しているユーザーからトークンを与えられています。おそらく、Visual Studioをユーザーアカウントから実行します。このユーザーアカウントは、SQL Serverインスタンスに対して管理者権限を持つ可能性があります。

IISがアプリケーションを実行するときに、アプリケーションプール(またはアプリケーションプール)と呼ばれるものが使用されます。複数のアプリを1つのプールにまとめて管理することができます。また、プールに指定された特別なユーザーアカウントでアプリケーションプールが実行されます。アプリケーションプールユーザーは「IIS AppPool」というコンテナの下に存在するため、DefaultAppPoolのローカルユーザーはIIS AppPool\DefaultAppPoolです。ローカルシステム上のリソースへのアクセス権(ファイルアクセス権を含む)を付与する場合は、それをアプリケーションプールユーザーまたはローカルグループIIS_IUSRSに付与して、すべてのアプリケーションプールに付与することもできます。

これらはローカルアカウントなので、ネットワーク境界を越えないことに注意してください。別のサーバーでアクセス許可を与えるには、ドメインユーザー(ドメイン管理サービスアカウント)を使用するか、またはアプリケーションプールユーザーをNETWORK SERVICEに設定し、アクセス許可をMyDomain\MyWebServer$に設定する必要がありますドル記号は重要です)。

関連する問題