2011-11-14 3 views
4

데이터베이스에있는 내 개체 중 일부는 존재하지 않는 관계로 0을 사용합니다. 그래서 NullableTuplizer 클래스를 설정했습니다. 이 온라인 코드를 찾았습니다. 지금까지 효과가 있었지만 문제가있는 것으로 나타났습니다. 우리는 선택 직후 엔티티가 더러워지면서 큰 문제를 겪고 있습니다. 그래서이 객체에 대해 Get()을 수행 한 직후, 더티 (dirty)와 NHibernate는이를 데이터베이스에 저장하려고 시도합니다.NHibernate PocoEntityTuplizer가 엔티티를 "dirty"로 설정하고 있습니다. 어떻게 그만합니까?

"매핑 문제"를 방지하려고합니다. 아무도 그것이 정말로 더럽지 않다는 것을 어떻게 알 수 있습니까?

public class NullableTuplizer : PocoEntityTuplizer 
{ 
    public NullableTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) 
     : base(entityMetamodel, mappedEntity) 
    { 
    } 

    public override object[] GetPropertyValuesToInsert(
     object entity, IDictionary mergeMap, ISessionImplementor session) 
    { 
     object[] values = base.GetPropertyValuesToInsert(entity, mergeMap, session); 
     //dirty hack 1 
     for (int i = 0; i < values.Length; i++) 
     { 
      if (values[i] == null && typeof(BaseEntity).IsAssignableFrom(getters[i].ReturnType)) 
      { 
       values[i] = ProxyFactory.GetProxy(0, null); 
      } 
     } 
     return values; 
    } 

    public override object[] GetPropertyValues(object entity) 
    { 
     object[] values = base.GetPropertyValues(entity); 
     //dirty hack 2 
     for (int i = 0; i < values.Length; i++) 
     { 
      if (values[i] == null && typeof(BaseEntity).IsAssignableFrom(getters[i].ReturnType)) 
      { 
       values[i] = ProxyFactory.GetProxy(0, null); 
      } 
     } 
     return values; 
    } 


    public override void SetPropertyValues(object entity, object[] values) 
    { 
     //dirty hack 3. 
     for (int i = 0; i < values.Length; i++) 
     { 
      dynamic val = values[i]; 
      if (typeof(BaseEntity).IsAssignableFrom(getters[i].ReturnType) && val.Id == 0) 
      { 
       values[i] = null; 
      } 
     } 
     base.SetPropertyValues(entity, values); 
    } 
} 

답변

0

당신은 엔티티를 재설정과 같은 코드를 시도 할 수 있습니다 NH가 변경되지 않은 생각 너무 :

public static void Reset(this ISession session, Object entity) 
    { 
     var sessionImpl = session.GetSessionImplementation(); 
     var context = sessionImpl.PersistenceContext; 
     var entry = context.GetEntry(context.Unproxy(entity)); 

     if ((entry == null) || (entry.RequiresDirtyCheck(entity) == false) || (entry.ExistsInDatabase == false) || (entry.LoadedState == null)) 
     { 
      return; 
     } 

     var persister = entry.Persister; 
     var currentState = persister.GetPropertyValues(entity, sessionImpl.EntityMode); 
     var loadedState = entry.LoadedState; 

     for (var 0; i < currentState.Length; ++i) 
     { 
      loadedState[i] = currentState[i]; 
     } 
    }