다음 코드는 삽입시 작동하지만 업데이트 modifier
이 설정되지 않은 이유는 무엇입니까?업데이트시 이벤트가있는 nhibernate 감사
사전 업데이트 코드가 실행 중이고 상태 값과 엔터티 값이 원하는 값으로 올바르게 설정되어 있습니다. 그러나 생성 된 SQL nhibernate를 볼 때 업데이트 쿼리의 필드는 포함되지 않습니다.
/// <summary> Updates auditable objects </summary>
public class AuditEventListener : IPreInsertEventListener, IPreUpdateEventListener
{
private ISecurityManager securityManager;
public bool OnPreInsert(PreInsertEvent args)
{
var auditable = args.Entity as IAuditable;
if (auditable != null) {
Set(x => auditable.Creator, args.Persister, auditable, args.State, SecurityManager.Identity);
Set(x => auditable.DateAdded, args.Persister, auditable, args.State, Clock.Now);
}
return false;
}
public bool OnPreUpdate(PreUpdateEvent args)
{
var auditable = args.Entity as IAuditable;
if (auditable != null) {
Set(x => auditable.Modifier, args.Persister, auditable, args.State, SecurityManager.Identity);
//Set(x => auditable.DateModified, args.Persister, auditable, args.State, Clock.Now);
}
return false;
}
/// <summary> Type safe method to update sate and entity </summary>
private void Set<T, U>(Expression<Func<U, T>> expression, IEntityPersister persister, U instance, object[] state, T value)
{
var member = expression.Body as MemberExpression;
if (member != null) {
var index = Array.IndexOf(persister.PropertyNames, member.Member.Name);
if (index == -1) {
return;
}
state[index] = value;
var property = (member.Member as PropertyInfo);
if (property != null) {
property.SetValue(instance, value, null);
}
}
}
ISecurityManager SecurityManager
{
get { /* From IoC */ }
}
}
이 코드는 Set 메서드가 비정상적이지만 잘 보입니다. OnPreUpdate에 중단 점을 넣으면 업데이트 된 객체를 유지할 때 호출되는 중입니까? –
네, 문제는 그 속성이 nhibernate에 의해 더럽다고 간주되지 않는 것과 관련이 있다고 생각합니다. –