「基になるプロバイダーが Open で失敗しました」というエラーが表示されます。最近、私はその理由を理解しようとして髪を引っ張っています. エラーを詳しく調べると、内部例外は「接続が閉じられませんでした。接続の現在の状態は接続中です」です。そしてスタックトレースは
"at System.Data.ProviderBase.DbConnectionClosedConnecting.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)"
私が知る限り、エラーはランダムに発生するか、アプリケーションに変更を加えたときに発生する可能性があります。どんな助けでも大歓迎です。
私の現在のセットアップは
- IIS エクスプレス
- Microsoft SQL Server エクスプレス エディション
- ビジュアル スタジオ 2012
- MVC Web API \ Asp.net MVC 4
- エンティティ フレームワーク 5
私のデータレイヤーはリポジトリパターンからモデル化され、構造マップを介して注入されます。
リポジトリ
public class Repository<T> : IDisposable, IRepository<T> where T : class
{
private readonly DbSet<T> _dbSet;
private readonly DbContext _dbContext;
public Repository(IDbContextFactory<MyContext> dbContextFactory)
{
_dbContext = dbContextFactory.Create();
_dbSet = _dbContext.Set<T>();
}
//removed for brevitity
public void Dispose()
{
_dbContext.Dispose();
}
DbContextFactory
public class MyContextFactor : IDbContextFactory<MyContext>, IDisposable
{
private MyContext _dataContext;
public MyContextFactor Create()
{
return _dataContext ?? (_dataContext = new MyContext());
}
public void Dispose()
{
_dataContext.Dispose();
}
}
IOC の構造マップ レジストリ
For(typeof(IDbContextFactory<MyContext>)).HybridHttpOrThreadLocalScoped().Use(typeof(MyContextFactory));
接続文字列
<add name="MyContextConnectionString" connectionString="metadata=res://*/Model.MyProject.csdl|res://*/Model.MyProject.ssdl|res://*/Model.MyProject.msl;provider=System.Data.SqlClient;provider connection string="data source=(local);initial catalog=MyDB;User Id=SQLUser;Password=****;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient"/>
問題を解決しようとして、これまでのところうまくいかなかったもの
- コンテキストが構造マップ スコープを介して http コンテキストごとであることを確認する
- dispose をリポジトリに追加
- ContextFactory に dispose を追加
- 統合された SQL 認証から SQL 認証に切り替え