web-dev-qa-db-ja.com

接続文字列をコードファーストDbContextに渡す

接続文字列をエンティティフレームワークのコードファーストDbContextに渡すにはどうすればよいですか? DbContextとweb.configの接続文字列の両方が同じプロジェクトにあり、同じ名前が付けられている場合、データベース生成は正しく機能します。ただし、DbContextを別のプロジェクトに移動する必要があるため、次のように接続文字列を渡すことをテストしています。

モデルとコンテキスト

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

アクション

    public ActionResult Index()
    {
        var db = new NerdDinners(ConfigurationManager.ConnectionStrings["NerdDinnerDb"].ConnectionString);

        var dinners = (from d in db.Dinners
                      select d).ToList();
        return View(dinners);
    }

Web.Config

<connectionStrings>
  <add name="NerdDinnerDb" connectionString="Data Source=|DataDirectory|NerdDinners.sdf" providerName="System.Data.SqlServerCe.4.0"/>    
</connectionStrings>

アクションにブレークポイントを設定してdbを分析すると、接続文字列はそこにありますが、データベースなどは作成または検索されません。

SQL Serverへの接続を確立中に、ネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからなかったか、アクセスできませんでした。インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認してください。 (プロバイダー:名前付きパイププロバイダー、エラー:40-SQL Serverへの接続を開けませんでした)

83
Shawn Mclean

ドキュメントを読んだ後、代わりに接続文字列の名前を渡す必要があります。

var db = new NerdDinners("NerdDinnerDb");
56
Shawn Mclean

ここでゲームに少し遅れましたが、別のオプションは次のとおりです。

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
    {
        this.Database.Connection.ConnectionString = connString;
    }
    public DbSet<Dinner> Dinners { get; set; }
}
81
Bitfiddler

「DbContextに接続文字列を渡す方法」を探している人にこのビットを追加すると思います:基になるデータストアの接続文字列を構築し、DbContextから派生した型のコンストラクタに接続文字列全体を渡すことができます。

(@Lol Coderからのコードの再利用)モデルとコンテキスト

public class Dinner
{
    public int DinnerId { get; set; }
    public string Title { get; set; }
}

public class NerdDinners : DbContext
{
    public NerdDinners(string connString)
        : base(connString)
    {
    }
    public DbSet<Dinner> Dinners { get; set; }
}

次に、次のようにSqlConnectioStringBuilderを使用してSql接続文字列を作成するとします。

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(GetConnectionString());

GetConnectionStringメソッドは適切な接続文字列を構築し、SqlConnectionStringBuilderは接続文字列が構文的に正しいことを確認します。次のようにdb conetxtをインスタンス化できます。

var myContext = new NerdDinners(builder.ToString());
36

DbContextで、DbContextのデフォルトコンストラクターを作成し、次のようにベースを継承します。

    public myDbContext()
        : base("MyConnectionString")  // connectionstring name define in your web.config
    {
    }
27
Kinh Pham

私はその問題の小さな解決例を持っています。

MyDBContext.cs

 public MyDBContext(DBConnectionType ConnectionType) //: base("ConnMain")
  {
      if(ConnectionType==DBConnectionType.MainConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnMain"].ConnectionString;
       }
      else if(ConnectionType==DBConnectionType.BackupConnection)
       {
         this.Database.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnBackup"].ConnectionString;
       }
  }

MyClass.cs

public enum DBConnectionType
 {
    MainConnection=0,
    BackupConnection=1
 }

frmMyForm.cs

 MyDBContext db = new MyDBContext(DBConnectionType.MainConnection);
                               //or
//MyDBContext db = new MyDBContext(DBConnectionType.BackupConnection);
2
Durgesh Pandey

アプリ内で接続文字列を作成する場合は、connStringのコマンドを使用します。 Web構成で接続文字列を使用している場合。次に、その文字列の「名前」を使用します。

2
MKunstman

Web.configで接続文字列の構文を確認してください。 ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"のようなものでなければなりません

1
kmerkle

EFモデルを使用する場合、EFプロジェクトを使用する各プロジェクトに接続文字列があります。たとえば、別のクラスライブラリにEF EDMXモデルがあります。 EF dbにアクセスできるように、Web(mvc)プロジェクトに1つの接続文字列があります。

リポジトリをテストするための別のユニットテストプロジェクトもあります。リポジトリがEF dbにアクセスするために、テストプロジェクトのapp.configファイルには同じ接続文字列が含まれています。

DB接続はIMOでコーディングするのではなく、構成する必要があります。

1
danludwig

あなたのコードに問題はありません。SqlExpressを使用していますが、コンストラクターで接続文字列を使用すると正常に動作します。

プロジェクトにApp_Dataフォルダーを作成しましたか?

0
Lee Smith