2013-09-04 4 views
2

Я установил IIntercpetor, чтобы обновить временную метку (дату последней модификации) объектов при их сохранении или обновлении.NHibernate Interceptor не работает

Мой implementaion выглядит следующим образом:

public class NhInterceptor : EmptyInterceptor 
{ 
    public override bool OnSave(object entity, object id, object[] state, 
     string[] propertyNames, NHibernate.Type.IType[] types) 
    { 
     var baseEntity = entity as EntityBase; 
     if (baseEntity == null) 
      return false; 

     baseEntity.LastModification = DateTime.Now; 
     return true; 
    } 

    public override bool OnFlushDirty(object entity, object id, 
     object[] currentState, object[] previousState, 
     string[] propertyNames, NHibernate.Type.IType[] types) 
    { 
     var baseEntity = entity as EntityBase; 
     if (baseEntity == null) 
      return false; 

     baseEntity.LastModification = DateTime.Now; 
     return true; 
    } 
} 

Этот код попал, и отладчик показывает, что baseEntity.LastModification имеет правильное значение, как раз перед возвращением.

Однако мой вывод Json (в Web API) показывает LastModification как 0001-01-01T00:00:00, и если я проверю свой созданный объект в базе данных, он также покажет тот же результат.

Почему это не работает?

ответ

2

Необходимо изменить текущие значения состояния. Первый поиск в именах свойств для «LastModification», затем измените currentState индекса, если он найден. Вы можете также проверить тип IType [] для этого типа.

+0

Я предпочел бы не иметь "волшебные струны", это бедные для рефакторинга. Но действительно, это работает! – Joel

+3

Вы можете предотвратить использование MagicString с помощью выражения, например кода здесь, например: http://www.codeproject.com/Tips/301274/How-to-get-property-name-using-Expression – Hylaean

+0

Я не могу выдвигать вас больше;), что делает трюк! – Joel

1

Я решил дать вам свое рабочее решение, основанное на ответе Hylaean.

Мой Перехватчик класс:

public class NhInterceptor : EmptyInterceptor 
{ 
    public override bool OnSave(object entity, object id, object[] state, 
     string[] propertyNames, NHibernate.Type.IType[] types) 
    { 
     var baseEntity = entity as EntityBase; 
     if (baseEntity == null) 
      return false; 

     var lastModificationPropName = ExpressionUtil 
      .GetPropertyName<EntityBase>((e) => e.LastModification); 

     for (int i = 0; i < propertyNames.Length; i++) 
     { 
      if (lastModificationPropName == propertyNames[i]) 
      { 
       state[i] = DateTime.Now; 
       return true; 
      } 
     } 

     return true; 
    } 

    public override bool OnFlushDirty(object entity, object id, 
     object[] currentState, object[] previousState, 
     string[] propertyNames, NHibernate.Type.IType[] types) 
    { 
     var baseEntity = entity as EntityBase; 
     if (baseEntity == null) 
      return false; 

     var lastModificationPropName = ExpressionUtil 
      .GetPropertyName<EntityBase>((e) => e.LastModification); 

     for (int i = 0; i < propertyNames.Length; i++) 
     { 
      if (lastModificationPropName == propertyNames[i]) 
      { 
       currentState[i] = DateTime.Now; 
       return true; 
      } 
     } 
     return true; 
    } 
} 

Мой Экспрессия Util класс:

public static class ExpressionUtil 
{ 
public static string GetPropertyName<T>(Expression<Func<T, object>> expression) 
    { 
     var body = expression.Body as MemberExpression; 

     if (body == null) 
     { 
      body = ((UnaryExpression)expression.Body).Operand as MemberExpression; 
     } 

     return body.Member.Name; 
    } 
} 
Смежные вопросы