2016-11-30 30 views
2

私はこの問題をできる限り明確に説明しようとしています。Web APIとEntity Framework、データベース接続を指定する場所は?

私は2つのプロジェクトを開始します。

プロジェクトワン:データモデル


単一DbSetを持っているDbContextをラップリポジトリクラス:RentalListings

このDbContextを使用しています変更を保存すると、ローカルDBに保存されるようになります。

プロジェクト2:コンソールアプリケーション


実行すると、リポジトリクラスのインスタンスをインスタンス化することをコンソールアプリケーションが含まれています。

次に、複数の「レンタルリスト」を作成し、それらをリポジトリに保存します。


これまでのところとても良いです。コンソールアプリケーションを実行した後、私はローカルのDB SQLオブジェクトエクスプローラをチェックし、私のリポジトリクラスはsuccessfulyこのdbに保存されています。

今、私はこの挿入されたデータにWeb APIを介してアクセスする方法が必要です。私は新しいコントローラクラスを作成するWeb API

とのすべてのリストを取得するために、単一のGETアクションメソッドを追加します。

プロジェクト3:だから私は追加します。正しいURLを経由して

[HttpGet] 
public IEnumerable<RentalListing> GetAllListings() { 
      StatsRepository repository = new StatsRepository(new StatsContext()); 
      return repository.GetRentalListings(); 
     } 

:私はAPIプロジェクトを実行すると

は、私のように見えるアクションメソッドを打つことができます。しかし、私は次のエラーが返さ取得しています:

Unable to complete operation. The supplied SqlConnection does not specify an initial catalog or AttachDBFileName. 

さて、私は問題は、それがデータベースにアクセスする方法を知らないということだと思うのウェブ検索から???そして、Web APIプロジェクトのWeb.configファイルに接続文字列を指定する必要があります。

質問:

1)どのように接続文字列を指定していない私のコンソールアプリは、私のリポジトリクラスを使用してMDFのデータベースを作成しましたか?

2)Web apiプロジェクトで同じ作業が行われないのはなぜですか?コンソールアプリケーションのように、リポジトリを使ってデータベースを取得することはできませんか?

返信をお待ちしております、ありがとうございます!

答えて

1

Q:1。接続文字列を指定していないコンソールアプリケーションは、自分のリポジトリクラスを使用してmdfデータベースを作成しましたか?

A:1。これはデフォルトです。コンソールアプリケーションで接続文字列を指定しなかった場合は、コンテキストクラスの名前空間とコンテキストクラスの名前を使用してdbを作成します。

Contextクラスの名前空間= MyDbContextNameSpace

コンテキストクラスの名前= MyContext

その後、あなたのDB名は次のようになります:MyDbContextNameSpace.MyContext

注: SQL Expressがインストールされている場合、ローカルSQL Expressインスタンス(。\ SQLEXPRESS)にデータベースが作成されます。 SQL Expressがインストールされていない場合、Code FirstはLocalDb((localdb)\ v11.0)を試してみます。

あなたはここでそれについての詳細を読むことができます:Building an Initial Model & Database

Q:2。私のweb apiプロジェクトで同じ作業が行われないのはなぜですか?コンソールアプリケーションのように、リポジトリを使ってデータベースを取得することはできませんか?

A:2。Http/sでEFと話すときは、web.configファイルに接続文字列を入力する必要があります。さもなければ、EFはそれを行う方法を知らない。それは設計によるものである。

MyContext。情報のためのCS

public class MyContext : DbContext 
{ 
    public MyContext() : base(“name=MyContextConn”) 
    { 
    } 

     public DbSet<Blog> Blogs { get; set; } 
} 

web.configファイル

<connectionStrings> 
    <add name=“MyContextConn“ connectionString=“conndetails” 
     providerName=“System.Data.SqlClient“ /> 
</connectionStrings> 
+0

おかげでたくさんの。それは私のコンソールアプリケーションが接続文字列を必要としない理由を理解する助けになりました(規約では、ローカルDBを使ってMDFファイルを作成しました)。まったく同じDBコンテキストを使用しているWeb APIプロジェクトがなぜ同じことをすることができないのかについてはまだ曇っています。しかし、私はちょうどそれを今受け入れます! – AndyNZ

+0

あなたは暖かく歓迎しています:)あなたの質問については、EFはHTTP/S(web/web API)で使用するとそのように設計されました。そのような状況ではコンソールアプリケーションのように動作しません。 – Sampath

1
  1. DbContextクラスは間違いなくあなたがそれを置くように、「接続文字列を指定する」の責任を負うことができますが、それが最も一般的に設定ファイルで発見された理由は、異なる接続文字列が異なる構成を指定することができそうということです。たとえば、Web.Debug.configという接続文字列は、開発ボックスにインストールしたSqlExpressのインスタンスを指し、Web.Release.config接続文字列がAzureに含まれるSQLインスタンスを指している可能性があります。
  2. 設定ファイルに接続文字列を指定しても、必ずしも問題を解決するわけではありません。接続文字列には、ユーザー名とパスワードを指定できます。これらの文字列を接続文字列に入れると、ほとんどの場合動作します。たとえば、<add name="DefaultConnection" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" providerName="System.Data.SqlClient" />
  3. 問題は、コンソールアプリケーションがアプリケーションを起動しているWindowsユーザーのコンテキストで実行されている可能性が高いためです。これらの資格情報を使用してデータベースに接続しています。私はあなたのコンソール、webapi appとsqlがすべて同じマシンにインストールされている/実行されていることを前提としており、SSMSを使用していると仮定してsqlにログインするためにあなたのユーザーがあなただけです。しかし、WebアプリケーションはIISまたはIISExpressを介して実行される可能性が高く、デフォルトでは別のコンテキストで実行されます(IIS用のIUSRと思われます)。あなたの接続文字列に統合セキュリティを使用したいのであれば(これはあなたのユーザー名とパスワードをあなたのconfigsから外しておく - 一般的には良い方法です)、<add name="DefaultConnection" connectionString="Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=True" providerName="System.Data.SqlClient" />のように、アプリケーションが存在するコンテキストを設定しますapppoolが実行されているユーザーを更新して実行します。 updating the app pool identityでこれを行い、Webアプリケーションがusing that app poolであることを確認します。

これが役に立ちます。

関連する問題