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);
}
}