ตัด 'การเชื่อมโยง' ด้วยบริบท 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)


ฉันปิดการใช้งาน Lazy Loading ของเอนทิตี บริบทข้อมูลของกรอบงานโดยใช้:

context.Configuration.LazyLoadingEnabled = false;

และนั่นเป็นการบังคับให้บริบทข้อมูลดึงข้อมูลค่าทั้งหมดในครั้งเดียว อย่างไรก็ตาม ฉันต้องการฟังคำอธิบายว่าเหตุใดวิธี AsNoTracking() จึงไม่ทำงาน

person astralmaster    schedule 21.08.2017