سؤال

لذلك أنا فقط إصلاح الخلل في إطار انا النامية.الزائفة شبة الكود يبدو مثل هذا:

myoldObject = new MyObject { someValue = "old value" };
cache.Insert("myObjectKey", myoldObject);
myNewObject = cache.Get("myObjectKey");
myNewObject.someValue = "new value";
if(myObject.someValue != cache.Get("myObjectKey").someValue)
     myObject.SaveToDatabase();

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

سؤالي هو: هل هناك طريقة أفضل للقيام بذلك ، بعض نمط ، التي يمكن أن يوصي ؟ لا أستطيع أن أكون الشخص الوحيد الذي فعل هذا من قبل :)

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

المحلول

القذرة تتبع العادي طريقة للتعامل مع هذا ، على ما أعتقد.شيء من هذا القبيل:

class MyObject {
  public string SomeValue { 
     get { return _someValue; }
     set { 
       if (value != SomeValue) {
          IsDirty = true;
          _someValue = value;
       }
  }

  public bool IsDirty {
     get;
     private set;
  }

  void SaveToDatabase() {
     base.SaveToDatabase(); 
     IsDirty = false;
  }
}

myoldObject = new MyObject { someValue = "old value" };
cache.Insert("myObjectKey", myoldObject);
myNewObject = cache.Get("myObjectKey");
myNewObject.someValue = "new value";
if(myNewObject.IsDirty)
   myNewObject.SaveToDatabase();

نصائح أخرى

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

أعتقد أن هذا مقبول تماما طالما أن البيانات كنت تخزين/خدع صغيرة.

تحسن قليلا على علامات الإجابة إنها تبدو عند استخدام linq:

عند استخدام Linq, جلب الكيانات من DB سيمثل كل كائن كما IsDirty.أنا قدمت حلا لهذه, من خلال عدم وضع IsDirty عندما تكون القيمة غير تعيين ؛ على هذا المثال:عندما null.على رجات ، جلست على orig القيمة إلى -1, ثم التحقق من ذلك.هذا لن ينجح ، ومع ذلك ، إذا تم حفظ القيمة هو نفسه غير مهيأ قيمة (null في بلدي على سبيل المثال).

private string _name;
[Column]
public string Name
{
    get { return _name; }
    set
    {
        if (value != _name)
        {
            if (_name != null)
            {
                IsDirty = true;   
            }
            _name = value;
        }
    }
}

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

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