【发布时间】:2017-08-21 15:10:34
【问题描述】:
我有一个GridView,它的DataSource 设置为BindingSource,而它的Datasource 属性又设置为一个自定义的IEnumerable <SomeObject> 变量。此自定义对象来自实体框架的数据上下文。当我尝试从 GridView 修改值时,我收到错误“The ObjectContext instance has been disposed and can no longer be used for operations that require a connection error”。这是可以理解的,因为我在我的数据上下文已经被释放时进行了这些修改,但是有没有办法将这些更改存储在 IEnumerable 变量中并禁用它与已释放数据上下文的“绑定”?
编辑:为简化起见,如果我声明一个新 List 并将其设置为 DataSource 到上面提到的 BindingSource,那么当从 GridView 更新行时,我可以看到传播到这个 List 对象的更改。但是当这个对象是实体框架的数据上下文中的几个查询的结果时,如何做同样的事情,这似乎是“附加”某种残余物到结果对象。
以下是相关代码:
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;
}
}
【问题讨论】:
-
您需要一个内存中的对象,例如 List 或 Array。例如,改为绑定到
.ToList()。 stackoverflow.com/questions/18398356/… -
使用 AsNoTracking() 防止 Ef 跟踪对实体的更改
-
嗯,我在查询中添加了 AsNoTracking(),但仍然遇到同样的错误。听起来确实像我正在寻找的解决方案
标签: c# entity-framework datacontext