سؤال

أقضيت iinterceptor لكائنات ilogggable في نموذج المجال الخاص بي. وحدث OnflushDirty، أحاول حفظ سجل (التدقيق). ولكن أثناء القيام بذلك، يذهب التعليمات البرمجية إلى حلقة لانهائية.

_logropository.save (log) يستدعي onflushdirty حتى إذا كان السجل ليس كائنا ilogggable (هو لأن الكيان لا يزال الكائن السابق)

هل هناك طريقة لاستخدامها. واصف (دون فتح جلسة أخرى) في iinterceptor، أو كيف يمكنني إدراج تسجيل الدخول إلى قاعدة البيانات في iinterceptor؟


public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types)
    {
      //find diffs, log each change
      if (entity is ILoggable && entity is NamedEntity)
      {
        var namedEntity = entity as NamedEntity;
        for (var i = 0; i < currentState.Count(); i++)
        {
          if (currentState[i] != previousState[i])
          {
            var log = new Log()
                        {
                          Description = "update",
                          InDate = namedEntity.ModifiedDate.Value,
                          ItemId = namedEntity.Id,
                          ItemType = namedEntity.GetType().Name,
                          NewValue = currentState[i].ToString(),
                          OldValue = previousState[i].ToString(),
                          PropertyName = propertyNames[i],
                          UserId = namedEntity.ModifiedByUserId.Value
                        };

            // calling save calls onflushdirty again, where entity is not log, but the same entity of the first call
            ObjectFactory.GetInstance().Save(log);
          }
        }
      }
      return base.OnFlushDirty(entity, id, currentState, previousState, propertyNames, types);
    }
هل كانت مفيدة؟

المحلول

حسنا، لقد احسبت ذلك، مشكلتي كانت _logrepository.save (سجل) فتح معاملة أخرى وتشغيلها. لذلك، قمت بتغيير LogrePository.AVE (LOG) عدم فتح وتعامل معاملة أخرى ولكنها تستخدم معاملة مفتوحة.

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