10

アルバハリは「一言で言えばc#4.0」と書いています。

> DataContext / ObjectContextはIDisposableを実装しますが、(一般的に)インスタンスを破棄せずに逃げることができます。破棄すると、コンテキストの接続が強制的に破棄されますが、クエリから結果を取得し終えるたびにL2SとEFが自動的に接続を閉じるため、通常は不要です。<<

これは間違っていると感じ、IDisposableであるものを処分していない場合、FxCopも文句を言います。

私は次のリポジトリコードを持っています:

    public abstract class Repository<TEntity> : IRepository<TEntity> where TEntity : class
    { ...
        public void Add(TEntity entity)
    {
        using (var dbContext = this.UnityContainer.Resolve<DbContext>())
        {
            dbContext.Set<TEntity>().Add(entity);
            dbContext.SaveChanges();
        }
    }

    ...

    public virtual IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> expression)
    {
       using (var dbContext = this.UnityContainer.Resolve<DbContext>())
       {
           return dbContext.Set<TEntity>().Where(expression).ToList().AsEnumerable();
       }
    }
    ...

注:IQueryableを返しません-遅延読み込みは役割を果たさないはずです。ResolveDbContextはPerResolveLifetimeManagerとして構成されています。

このアプローチは大丈夫ですか、それともアルバハリスの説明に基づいてこれを再考する必要がありますか?

4

2 に答える 2

7

クラスが公開している場合は、常にdisposeを呼び出す必要があります。このステートメントは、EFとL2Sが操作を終了するたびに接続を閉じると主張しています。ステートメントは正しいと思いますが、同時にADO.NETチームもDisposeメソッドで接続を閉じるため、接続が閉じられない場合があります。

于 2012-05-31T09:18:43.950 に答える
0

私はEF4.0ObjectContextに取り組んでいます(ええ、私は知っています...)。私はDotPeekのコードを見ることになり、disposeは、接続への参照とObjectContextクラスの他のいくつかのものをnullにするだけです。

接続が作成されると(DotPeekでも検出されます)、既存のインスタンスが返されます。接続文字列が変更されると、すべてのインスタンスの接続文字列が更新されます。

それは少なくとも私の見解でした。もっと深く見る必要がありますが、一見すると、それでうまくいくようです。

于 2016-10-12T04:31:13.190 に答える