حفظ الكائنات في Nibernate iinterceptor
-
18-09-2019 - |
سؤال
أقضيت 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) عدم فتح وتعامل معاملة أخرى ولكنها تستخدم معاملة مفتوحة.
لا تنتمي إلى StackOverflow