Вырезать «привязку» к контексту Entity Data после извлечения объекта

У меня есть 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 и отключить ее «привязку» к этому удаленному контексту данных?

Изменить: для упрощения. Если я объявлю новый список и установлю его в качестве источника данных для упомянутого выше BindingSource, то при обновлении строк из GridView я смогу увидеть изменения, распространяемые на этот объект списка. Но как сделать то же самое, когда этот объект является результатом нескольких запросов в контексте данных 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;

                    }

                }

person astralmaster    schedule 21.08.2017    source источник
comment
Вам нужен объект в памяти, такой как List или Array. Например, вместо этого привяжите к .ToList(). stackoverflow.com/questions/18398356/   -  person Steve Greene    schedule 21.08.2017
comment
Используйте AsNoTracking(), чтобы запретить Ef отслеживать изменения в объектах.   -  person esnezz    schedule 21.08.2017
comment
Хм, я добавил AsNoTracking() в свой запрос, но все равно получаю ту же ошибку. Это звучит как решение, которое я ищу, хотя   -  person astralmaster    schedule 21.08.2017


Ответы (1)


Я отключил отложенную загрузку сущности. Контекст данных Framework с использованием:

context.Configuration.LazyLoadingEnabled = false;

И это заставляло контекст данных извлекать все значения сразу. Однако хотелось бы услышать объяснение, почему метод AsNoTracking() не сработал.

person astralmaster    schedule 21.08.2017