在对象检索后使用实体数据上下文剪切 'binding'
Cut 'binding' with Entity Data context after object retrieval
我有一个 GridView
,其 DataSource
设置为 BindingSource
,而 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 变量中并禁用它 'binding' 到已处置的数据上下文?
编辑:为简化起见,如果我声明一个新列表并将其设置为上面提到的 BindingSource 的 DataSource,那么当从 GridView 更新行时,我可以看到传播到此 List 对象的更改。但是当这个对象是 Entity Framework 的数据上下文中的几个查询的结果时如何做同样的事情,这似乎是 'attaching' 结果对象的某种残余。
相关代码如下:
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;
}
}
我使用以下方法禁用了 Entity Framework 数据上下文的 Lazy Loading:
context.Configuration.LazyLoadingEnabled = false;
这迫使数据上下文一次检索所有值。但是,我想听听有关 AsNoTracking()
方法为何不起作用的解释。
我有一个 GridView
,其 DataSource
设置为 BindingSource
,而 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 变量中并禁用它 'binding' 到已处置的数据上下文?
编辑:为简化起见,如果我声明一个新列表并将其设置为上面提到的 BindingSource 的 DataSource,那么当从 GridView 更新行时,我可以看到传播到此 List 对象的更改。但是当这个对象是 Entity Framework 的数据上下文中的几个查询的结果时如何做同样的事情,这似乎是 'attaching' 结果对象的某种残余。
相关代码如下:
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;
}
}
我使用以下方法禁用了 Entity Framework 数据上下文的 Lazy Loading:
context.Configuration.LazyLoadingEnabled = false;
这迫使数据上下文一次检索所有值。但是,我想听听有关 AsNoTracking()
方法为何不起作用的解释。