سؤال

لقد كنت أبحث في بعض السنانير تدقيق مع إطار الكيان. يعرض الكثير منهم مقارنات قيمة قديمة / جديدة. هذا رائع لمدير التدقيق ولكن أبحث عن كائنات لقطة.

على سبيل المثال ... دعنا نقول أن لدي تطبيق يدير المنتجات. يحتوي المنتج على سمات متعددة والكائنات الأخرى المرتبطة بها. دعنا نقول أنني أغير كائن 10 مرات. لنفترض أيضا أن هذا مهم أتمكن من عرض شاشات من هذه التغييرات الكائنات (وليس درب التدقيق ولكن ما تبدو الشاشة بالفعل في شكل قراءة فقط). ما يهمني أنه قادر على استرداد كائن منتج EF الأصلي (مع جميع البيانات المرتبطة) لجميع تلك التغييرات (حسب هذه التغييرات (اعتمادا على ما أريد رؤيته) واستخدم ذلك لربطها بوجود شاشتي.

إذا كنت أستخدم SQL Server، فما النوع الذي يجب أن أستخدمه للكائن المسلسل في الوقت الحاضر (XML، Blob، إلخ)؟ هل من المنطقي القيام بذلك؟

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

المحلول

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

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

أود أن أقترح عليك أن تسمح بإصدار جميع أنواع كيانك. عند تحرير نوع الكيان، ستقوم بتحرير مراجعة TIP وتخزين مراجعة خلفية تحتوي على القيم السابقة. (السبب في تحرير مراجعة التلصح بدلا من إدراج نصيحة جديدة هو أن الكائنات الأخرى، والتي لم تتحقق حاليا في ObjectContext، قد تحتوي على روابط إلى الطرف الذي ترغب في الحفاظ عليه كوصلة على الطرف، بدلا من الروابط مراجعة الظهر.)

إذا لزم الأمر، يمكنك تقسيم جداول SQL Server الخاصة بك بحيث يتم تخزين تنقيحات الظهر في مجموعة ملفات مختلفة. هذا من شأنه أن يسمح لك بالنسخ الاحتياطي لمراجعات الطرف والمراجعات الخلفية بشكل منفصل.

نصائح أخرى

تحتاج أولا إلى إضافة مجموعة من الخصائص إلى الجداول الخاصة بك:

  • إصدار - وقت التعديل الأخير (يمكن أيضا أن يكون عداد تلقائيا بدلا من الوقت).
  • LastMoDiedby - إشارة إلى المستخدم الذي جعل التعديل الأخير (إذا قمت بتخزين ذلك).

ثم لديك العديد من الخيارات حول كيفية تخزين سجل الإصدار الخاص بك. يمكنك

  1. قم بإنشاء جدول جديد لكل من الجداول الرئيسية التي تريد تخزينها من أجلها. ستحتوي جداول التاريخ على نفس الحقول مثل الجدول الرئيسي، ولكن لن يتم تطبيق المفاتيح الابتدائية والأجنبية. بالنسبة لكل مفتاح أجنبي أيضا تخزين إصدار الإدخال المشار إليه في الإصدار الزمني تم إنشاؤه.

  2. أو يمكنك تسلسل كل شيء مثير للاهتمام حول كيانك وتخزين كل تلك النقط المسلح لجميع الكيانات التي تريد إصدارها في جدول تاريخ عالمي واحد (أنا شخصيا أفضل النهج الأول).

كيف تملأ جداول التاريخ الخاصة بك؟ عبر التحديث وحذف المشغلات.

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

لاحظ أن المزيد والمزيد من الأنظمة الحديثة لا تحذف أي شيء. انهم فقط علامة أشياء كما تم حذفها. إذا كنت ترغب في اتباع هذا النمط (الذي يحتوي على العديد من الفوائد) - بدلا من حذف إشارة إضافة isdeleted إلى كياناتك (بالطبع، عليك بعد ذلك تصفية الكيانات المحذوفة في كل مكان).

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

بالإضافة إلى كل ما سبق - يمكنك أيضا استعادة حالة كيانك لأي إصدار سابق.

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

في مشروع قمت مؤخرا أننا استخدمنا أننا توصلنا إلى SaveChanges طريقة في DbContext صف دراسي. هذا أعطانا الوصول إلى مثيل ChangeTracker صف دراسي. دعا ChangeTracker.Entries() يمنحك الوصول إلى قائمة DbEntityEntry. DbEntityEntry لديه الخصائص والأساليب التالية المثيرة للاهتمام:

  • State - هل الكائن الذي تم إنشاؤه حديثا أو تعديله أو حذفه
  • Entity - نسخة من الكائن كما هو
  • CurrentValues - تعداد التحرير القيمة
  • OriginalValues - تعداد القيم الأصلية

أنشأنا مجموعة من Pocos لتغيير مجموعات وتغييرات يمكننا الوصول إليها بعد ذلك من خلال EF. سمح ذلك لمستخدمينا بمشاهدة تغييرات مستوى الحقل مع التواريخ والمستخدمين المسؤولين.

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