우리는 NHibernate 이벤트 리스너를 통해 감사 시스템을 구현했다. 청취자는 모든 변경 사항을 추적하여 감사 테이블에 기록합니다. 성능을 극대화하기 위해 우리는 가능한 한 업데이트를 배치 할 수 있도록 감사 테이블에 Guid를 사용했습니다.NHibernate 자식 세션이 제대로 플러시되지 않는다
우리는 다음과 같이 얻을 "자식 세션"에 업데이트를 작성하십시오 NHibernate에 문서에서
protected ISession GetSession(AbstractEvent @event)
{
if (@event == null)
{
throw new ArgumentNullException("event");
}
ISession childSession = @event.Session.GetSession(EntityMode.Poco);
return childSession;
}
,이 세션은 그것의의 모든 속성을 상속하는 "아이"세션해야한다 부모 - 거래를 포함하여.
childSession.Save(auditLogEntry);
이 모든
가 트랜잭션 내에서 호출되고 난 childSession에 대한 변경 사항이 트랜잭션 번 세척 것이라고 기대 : 우리는 엔티티를 생성하면, 우리는 함께 세션에 저장 최선을 다합니다. 불행히도, 아무 일도 일어나지 않고 변화가 지나치지 않습니다.
저장 직후 수동 플러시와 함께 작동하도록 설정할 수는 있지만 변경 사항이 더 이상 허용되지 않는 성능을 나타내므로 변경되지 않습니다.
처음에는이 동작이 이벤트에만 국한된 것으로 생각했지만 동작을 복제하기 위해 단위 테스트로 추상화 할 수있었습니다.
public void When_Saving_Audit_Log_Records_To_Child_Session_Flushes_When_Transaction_Committed()
{
ISession session = GetSession();
session.FlushMode = FlushMode.Commit;
ITransaction transaction = session.BeginTransaction();
ISession childSession = session.GetSession(EntityMode.Poco);
AuditLogEntry entry = CreateAuditLogEntry();
entry.AddAuditLogEntryDetail(CreateAuditLogEntryDetail());
entry.AddAuditLogEntryDetail(CreateAuditLogEntryDetail());
childSession.Save(entry);
transaction.Commit();
}
protected ISession GetSession()
{
return _sessionFactory.OpenSession();
}
나는이 밀 NHibernate에 질문의 러닝 아니라는 것을 알고 있지만, 사람이 공유하는 경험이나 조언이 있다면, 나는 그것을 듣고 싶어요.
감사 레코드를 대기열에 기록한 직후 2 초 전이지만 포기하기 전에 모든 가능성을 피하려고했습니다. 사전에
감사합니다,
스티브