تحويل العرض إلى جداول وحفظ التغييرات يمنحني استثناءً متفائلًا للتزامن

StackOverflow https://stackoverflow.com//questions/10689972

سؤال

أنا أعمل مع Entity Framework 4 (باستخدام كيانات التتبع الذاتي)، وأتمكن من الوصول إلى طريقة العرض، وهي عبارة عن دمج جدولين.لذلك عندما أقوم بتحديث معلومات العرض، أرسل STE للعرض إلى المستودع الذي يمكنه الوصول إلى قاعدة البيانات.

لقد قمت بما يلي:

عندما أتلقى وجهة نظري مع المعلومات المحدثة، أقوم بإنشاء STE1 وSTE2.كيف عندما أقوم بإنشاء STE، يتم إنشاء هذا بحالة مضافة.فكيف أعرف حالة STE لوجهة النظر التي تم تعديل الحالة بها، أقوم بتغيير حالة STEs الخاصة بي بهذه الطريقة MarkedAsModified.

بعد ذلك، كيف أحصل على معلومات الجدولين في STE الخاص بالعرض، وأقوم بتمرير المعلومات من العرض إلى STE الصحيح، وتطبيق التغييرات من STE إلى STE objectContext.

وأخيراً قمت بعمل saveChanges.ولكن في هذه الخطوة أتلقى Optimistic concurrency exception.أعتقد أن السبب هو أن STE تمر من الولاية إلى Added ل Modified لذلك يكتشف السياق أن هناك بعض التعديل بين الخلق والخلق SaveChanges, ، ولكني أحاول أيضًا ذلك AcceptChanges في STE، تم وضع علامة عليها لاحقًا على أنها معدلة، وتطبيق التغييرات وأخيرًا SaveChanges, ، ولكن المشكلة لا تزال قائمة.

كيف يمكنني حل المشكلة؟هل هناك طريقة أفضل للعمل مع العرض وEntity Framework v4؟

شكرًا.دايمروك.

تحرير 1:لا يزال لدي مشاكل.الكود الخاص بي هو التالي:

المكونات myComponent = new Components();...// هذا مطلوب لأنني أريد تحديث المعلومات، ولا أضيف تسجيلاً جديدًا.myContext.ApplyChanges("المكونات"، myComponent)؛miContexto.SaveChanges();

في saveChanges، أحصل على الاستثناء:أثرت عبارة التحديث أو الإدراج أو الحذف على عدد غير متوقع من الصفوف (0).ربما تم تعديل الكيانات أو حذفها منذ أن تم تحميل الكيانات.تحديث إدخالات ObjectStateManager.

وهي مشكلة؟لا أستطيع تعديل STE جديد تم إنشاؤه؟

شكرًا.

هل كانت مفيدة؟

المحلول

لقد وجدت طريقة لحل المشكلة.

في الحل الأول، كان الحل هو إجراء استعلام إلى قاعدة البيانات للحصول على السجلات الموجودة في قاعدة البيانات.يؤدي ذلك إلى إضافة الكيانات في السياق ومن ثم يمكن تعديل البيانات وحفظ التغييرات بشكل صحيح.

لكنني وجدت لاحقًا طريقة لتجنب الحاجة إلى جعل الاستعلام هو قاعدة البيانات لإضافة الكيانات المعدلة في السياق.

الطريقة باستخدام الكود التالي :

Customers myCustomer = new Customers  { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);

//update the data of the entity.

myContext.SaveChanges();

الحل هو إنشاء كيان جديد يقوم بتعيين المفتاح الأساسي.إذا كان للكيان FK فسيتم الإشارة إليه بنفس الطريقة.عند هذه النقطة، يتمتع الكيان بالحالة المضافة.

في وقت لاحق، يتم إرفاقه بالسياق، ومن ثم يمكن تعديله.عندما يتم تغيير حقل، يغير الكيان حالته إلى معدلة، لذا عند استدعاء saveChanges()، تقوم EF بتحديث الكيان، ولا تحاول إضافة كيان جديد.

أجد هذه المعلومات في هذا وصلة.في هذا المنشور الحل هو حذف كيان دون استرجاعه إلى قاعدة البيانات، ولكن الفكرة صالحة أيضًا إذا أردنا تعديل سجل موجود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top