3

「基になるプロバイダーが 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=&quot;data source=(local);initial catalog=MyDB;User Id=SQLUser;Password=****;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>

問題を解決しようとして、これまでのところうまくいかなかったもの

  • コンテキストが構造マップ スコープを介して http コンテキストごとであることを確認する
  • dispose をリポジトリに追加
  • ContextFactory に dispose を追加
  • 統合された SQL 認証から SQL 認証に切り替え
4

1 に答える 1

4

これは、キャッシュされていた ActionFilterAttribute であることが判明しました。ActionFilterAttribute には、正しく破棄されず、要求間で共有されていたエンティティ フレームワーク コンテキストが含まれていました。

于 2012-11-09T02:48:36.490 に答える