سؤال

أنا أستخدم اعتراضي Loghternate لتسجيل المعلومات حول التحديثات / إدراج / حذف إلى كيانات مختلفة.

المدرجة في المعلومات التي سجلها هي نوع الكيان والمعرف الفريد للكيان المعدل. معرف فريد ملحوظ كما <generator class="identity"> في ملف رسم الخرائط Lhibernate.

المشكلة الواضحة هي عند تسجيل عملية إدراج باستخدام iinterceptor.onsave () معرف الكيان لم يتم تعيينه بعد.

كيف يمكنني الحصول على معرف الكيان المدرج قبل تسجيل معلومات التدقيق؟

(لقد بحثت إلى مستمعي Lonhibernate Postave الحدث ولكن لا يمكنني الحصول عليها مع تكوين Spring.net الذي يتم استخدامه، لذلك أود أن أستلم مع اعتراضية إذا كان ذلك ممكنا)

رمز:

    // object id parameter is null...
    public override bool OnSave(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {            
        AddAuditItem(entity, INSERT);
        return false;            
    }
هل كانت مفيدة؟

المحلول

لقد عملت في جميع أنحاء هذه المشكلة عن طريق إضافة قائمة إلى فئة اعتراضي التي يتم ملؤها بالكائنات أثناء OnSave تطبيق.

في ال PostFlush التنفيذ يتم تكرار القائمة ويتم تشغيل كل عنصر كإدراج. استمرت الكائنات في هذه القائمة في PostFlush() وبالتالي قد ولدت معرفات.

يبدو أن هذا يعمل بشكل جيد ولكن سأكون ممتنا لو تم الإشارة إلى أي مطبات محتملة :-)

public class AuditInterceptor : EmptyInterceptor
{       
    // To hold inserted items to be audited after insert has been flushed
    private IList<object> insertItems = new List<object>();

    public override void PostFlush(System.Collections.ICollection entities)
    {            
        foreach (var entity in insertItems)
        {
            AddAuditItem(entity, INSERT);
        }
        insertItems.Clear();

        base.PostFlush(entities);
    }

    public override bool OnSave(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {            
        var auditable = entity as IAuditable;
        if (auditable != null) 
            insertItems.Add(entity);

        return false;            
    }
}

نصائح أخرى

جرب ال OnFlushDirty طريقة .. أو ربما PostFlush

تحرير: أيضا، يمكنك نشر التعليمات البرمجية الخاصة بك؟ لا تحصل على المعرف كمعلمة ل OnSave?

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