1

誰かがここで私を助けてくれますか?「ObjectContextインスタンスは破棄されたため、接続を必要とする操作には使用できなくなりました」という例外が発生するのはなぜですか? 次のセクションで?

    public virtual IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy)
    {
        if (this.CheckAccess(this.OnCanRead))
        {
            try
            {
                Expression<Func<TEntity, bool>> baseFilter = this.GetFilter(this.OnFilter);

                IQueryable<TEntity> result = this.Set.AsQueryable();

                if (baseFilter != null)
                {
                    result = result.Where(baseFilter);
                }

                if (filter != null)
                {
                    result = result.Where(filter);
                }

                if (orderBy == null)
                {
                    return result.ToList();
                }
                else
                {
                    return orderBy(result).ToList();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
        else
        {
            throw new AccessException("CanRead");
        }
    }

次のポイントを呼び出す前は、まだ ObjectContext が存在します。

                if (baseFilter != null)
                {
                    result = result.Where(baseFilter);
                }

                if (filter != null)
                {
                    result = result.Where(filter);
                }

なぜもう?

- 編集 -

詳細情報:

問題が発生する関数を使用するクラス: DbContextRepository

私のプログラムには、以下から派生した ShopRepository というクラスがあります。

public class ShopRepository : DbContextRepository<Shop>

さらに、私のプログラムには、問題のある関数と呼ばれる DataManager があります。

public static class DataManager
{
    public static void Initialize()
    {
        Initializer.Initializer.SetInitializer();

        ObjectFactory.Configure(
           x =>
           {
               x.For<DbContext>().Use<DataContext>();
               x.For<IUnitOfWorkFactory>().Use<DbContextUnitOfWorkFactory>();
           }
        );

        DbContextUnitOfWorkFactory.SetDbContext(CreateContext);
    }

    private static DbContext CreateContext()
    {
        return new DataContext();
    }

    private static ShopRepository _shops;

    public static ShopRepository Shops
    {
        get
        {
            if (DataManager._shops == null)
            {
                DataManager._shops = ObjectFactory.GetInstance<ShopRepository>();
            }

            return DataManager._shops;
        }
    }

- 編集 -

問題は見つかりましたが、修正方法がわかりません。ShopRepository でイベント OnFilter の場合、次のような動的な値が返されます。

x => x.InstallationId == InstallationRepository.CurrentInstallationId

のような固定値がある場合、エラーが発生します。

x => x.InstallationId == 1

が返され、エラーは発生しません。

4

1 に答える 1

0

コードのどこかで、クエリの結果を列挙する前にDbContextを破棄します。提供したコードにはありませんが、これが唯一の説明です。

于 2012-10-24T12:54:22.563 に答える