接続文字列をエンティティフレームワークのコードファースト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への接続を開けませんでした)
ドキュメントを読んだ後、代わりに接続文字列の名前を渡す必要があります。
var db = new NerdDinners("NerdDinnerDb");
ここでゲームに少し遅れましたが、別のオプションは次のとおりです。
public class NerdDinners : DbContext
{
public NerdDinners(string connString)
{
this.Database.Connection.ConnectionString = connString;
}
public DbSet<Dinner> Dinners { get; set; }
}
「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());
DbContextで、DbContextのデフォルトコンストラクターを作成し、次のようにベースを継承します。
public myDbContext()
: base("MyConnectionString") // connectionstring name define in your web.config
{
}
私はその問題の小さな解決例を持っています。
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);
アプリ内で接続文字列を作成する場合は、connStringのコマンドを使用します。 Web構成で接続文字列を使用している場合。次に、その文字列の「名前」を使用します。
Web.configで接続文字列の構文を確認してください。 ConnectionString="Data Source=C:\DataDictionary\NerdDinner.sdf"
のようなものでなければなりません
EFモデルを使用する場合、EFプロジェクトを使用する各プロジェクトに接続文字列があります。たとえば、別のクラスライブラリにEF EDMXモデルがあります。 EF dbにアクセスできるように、Web(mvc)プロジェクトに1つの接続文字列があります。
リポジトリをテストするための別のユニットテストプロジェクトもあります。リポジトリがEF dbにアクセスするために、テストプロジェクトのapp.configファイルには同じ接続文字列が含まれています。
DB接続はIMOでコーディングするのではなく、構成する必要があります。
あなたのコードに問題はありません。SqlExpressを使用していますが、コンストラクターで接続文字列を使用すると正常に動作します。
プロジェクトにApp_Dataフォルダーを作成しましたか?