ما هي أفضل طريقة لاستخدام الأسلوب .SaveChanges() في ADO.Net Data Services؟

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

سؤال

هل لدى أي شخص بعض المعلومات الجيدة حول استخدام طريقة .SaveChanges()؟

أواجه مجموعة متنوعة من المشكلات عند محاولة استخدام الأسلوب .SaveChanges() على كائن سياق البيانات الخاص بي.أقوم بأخذ البيانات من مصدر بيانات موجود، وإنشاء كائنات EntityFramework/DataService المناسبة، وملء تلك الكائنات التي تم إنشاؤها بالبيانات، وإضافة تلك الكائنات إلى السياق ثم حفظ تلك البيانات عن طريق استدعاء .SaveChanges.

السيناريوهات التي توصلت إليها (والمشاكل المرتبطة بها) هي على هذا النحو ...في كل سيناريو، لدي حلقة foreach تأخذ البيانات من الصفوف في DataTable وتولد الكائنات، وتربطها بالسياق أثناء تقدمها.(ملحوظة:ثلاثة كائنات "عضو" و"عنوانان" متصلان عبر مكالمة SetLink) - هذه في الأساس أداة تحويل لأخذ البيانات من مخزن بيانات واحد وتدليكها في مخزن بيانات يتم عرضه بواسطة خدمات البيانات.

  • قم باستدعاء .SaveChanges() بدون أية معلمات مرة واحدة في نهاية حلقة foreach (أي:خارج الحلقة)
    • خطأ OutOfMemory حوالي 1/3 الطريق (30.000 من أصل 90.000 عملية حفظ) - لست متأكدًا من كيفية حدوث ذلك على الرغم من أن كل عنصر حفظ عبارة عن استدعاء SQL منفصل لقاعدة البيانات، ما الذي يمكن أن تنفد منه الذاكرة؟
  • قم باستدعاء .SaveChanges() بدون أية معلمات مرة واحدة في كل حلقة
    • يعمل هذا، ولكنه يستغرق إلى الأبد (8 ساعات مقابل 90.000 عملية حفظ)
  • اتصل بـ .SaveChanges(SaveChangesOption.Batch) مرة واحدة في نهاية حلقة foreach
    • نفس خطأ OutOfMemory، ولكن بدون أي عمليات حفظ في قاعدة البيانات
  • قم باستدعاء .SaveChanges(SaveChangesOption.Batch) مرة واحدة لكل حلقة
    • 404 لم يتم العثور على خطأ
  • اتصل بـ .SaveChanges(SaveChangesOption.Batch) مرة واحدة لكل 10 حلقات
    • 400 خطأ في الطلب السيئ (أحيانًا)
    • OutOfMemory بعد عدد من التكرارات
  • هناك عدد من المحاولات العشوائية لإنشاء السياق مرة واحدة لكل حلقة، أو جعله كمتغير في بداية الحلقة أو جعله كمتغير عضو خاص متوفر.
    • نتائج مختلفة، غير قادرة على القياس، لا شيء جيد حقًا

ما هي الطريقة المفضلة لاستدعاء .SaveChanges() من كائن عميل عند القيام بتحميل بيانات كبيرة مثل هذا؟هل هناك شيء لا أفهمه حول كيفية عمل .SaveChanges()؟هل يمكن لأي شخص تقديم مزيد من التفاصيل حول كيفية استخدام هذه الوظيفة وما هي (إن وجدت) القيود المفروضة على حفظ البيانات عبر خدمات البيانات؟هل هناك أي أفضل الممارسات حول استدعاء الأسلوب .SaveChanges()؟هل هناك أي وثائق جيدة بشكل خاص حول استدعاء الأسلوب .SaveChanges()؟

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

المحلول

ليس لدي خبرة كبيرة في استخدام EntityFramework (فقط بعض التجارب العشوائية)، هل حاولت الاتصال بـ .SaveChanges() كل تكرار؟

أعني شيئا من هذا القبيل:

int i = 0;
foreach (var item in collection)
{
    // do something with your data
    if ((i++ % 10) == 0)
        context.SaveChanges();
}
context.SaveChanges();

أعلم أنه قبيح، لكنه أول حل ممكن توصلت إليه.

نصائح أخرى

أنا أستخدم EntityFramework في مشروع صغير أيضًا لذا فأنا مهتم جدًا بالسؤال أيضًا.سؤالين سريعين:هل حاولت تشغيل التخزين المؤقت لكائنات البيانات في سياق البيانات؟هل حاولت إغلاق سياق البيانات وإنشاء سياق جديد أثناء الحلقة لتحرير الذاكرة؟

يعتبر

كينيث

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