2017-08-21 7 views
0

DataSourceBindingSourceに設定され、DatasourceプロパティがカスタムIEnumerable <SomeObject>に設定されています。このカスタムオブジェクトは、Entity Frameworkのデータコンテキストに由来します。 GridViewから値を変更しようとすると、エラー「The ObjectContext instance has been disposed and can no longer be used for operations that require a connection error」が表示されます。データコンテキストが既に破棄されているときにこれらの変更を行うため、IEnumerable変数にこれらの変更を保存し、そのデータコンテキストにバインドするのを無効にする方法があるので、これは理解できますか?オブジェクト取得後にエンティティデータコンテキストで「バインディング」を切断します

編集:簡単にするために、新しいリストを宣言し、それを上位のBindingSourceにDataSourceとして設定すると、GridViewから行を更新すると、このListオブジェクトに伝播した変更を見ることができます。しかし、このオブジェクトが結果オブジェクトに何らかの種類の残差を「付ける」と思われるEntity Frameworkのデータコンテキストでのいくつかのクエリの結果である場合も同じことを行う方法。

using (AmboliCardEntities context = new AmboliCardEntities(Globals.StrEntityConnecitonString)) 
       { 


        var transaction = context.tblTransactions.AsNoTracking().FirstOrDefault(a => a.GUID == gTransaction); 
        if (transaction != null) 
        { 
         var ret = new TransactionData 
         { 
          Transaction = transaction, 

          ConstantAccumulations = context.tblConstantAccumulations.AsNoTracking() 
           .Where(a => a.transactionid == gTransaction && a.removed == false).AsNoTracking().ToList(), 

          Cashbacks = context.tblCashbacks.AsNoTracking() 
           .Where(a => a.transactionid == gTransaction && a.removed == false).AsNoTracking().ToList(), 

          PurchasedProducts = context.tblPurchasedProducts.AsNoTracking().Include(a => a.tblProduct) 
           .Include(a => a.tblProduct.tblProductBrand) 
           .Include(a => a.tblProduct.tblProductBrand.tblProductCategory) 
           .Include(a => a.tblVehicle) 
           .Include(a => a.tblVehicle.tblVehicleTrim) 
           .Include(a => a.tblVehicle.tblVehicleTrim.tblVehicleModel) 
           .Include(a => a.tblVehicle.tblVehicleTrim.tblVehicleModel.tblVehicleMake) 
           .Where(x => x.transactionid == gTransaction) 
           .AsNoTracking() 
           .ToList() 
         }; 

         var vehicles = context.tblVehicles.AsNoTracking().Include(x => x.tblVehicleTrim) 
          .Include(x => x.tblVehicleTrim.tblVehicleModel) 
          .Include(x => x.tblVehicleTrim.tblVehicleModel.tblVehicleMake) 
          .Where(a => a.cardid == transaction.cardguid) 
          .AsNoTracking() 
          .ToList(); 



         return ret; 

        } 

       } 
+0

リストや配列のようなメモリ内オブジェクトが必要です。たとえば、代わりに '.ToList()'にバインドします。 https://stackoverflow.com/questions/18398356/how-to-solve-the-error-the-objectcontext-instance-has-been-disposed-and-can-no-l –

+1

AsNoTracking()を使用してEfを防止するエンティティへの変更を追跡する – EsnEzz

+0

ええと、AsNoTracking()をクエリに追加しましたが、同じエラーが表示されます。それは私が探している解決策のように聞こえる – astralmaster

答えて

0

私が使用してEntity FrameworkののデータコンテキストのLazy Loading無効:

は、ここで関連するコードです

context.Configuration.LazyLoadingEnabled = false; 

そして、それは、一度にすべての値を取得するためのデータコンテキストを余儀なくされました。しかし、私はなぜAsNoTracking()メソッドがうまくいかなかったのかについての説明を聞きたいと思います。

関連する問題