NHibernate PocoEntityTuplizer устанавливает "грязные" объекты. Как мне это остановить?
Некоторые из моих объектов в моей базе данных используют 0 для несуществующих отношений. Поэтому я установил класс NullableTuplizer. Я нашел код для этого онлайн. До сих пор это работало, но я заметил проблему. У нас были серьезные проблемы с грязными объектами сразу после выбора. Поэтому сразу после Get() над этим объектом его грязный и NHibernate пытается сохранить его в базе данных.
Я пытаюсь предотвратить эти "проблемы с отображением". Кто-нибудь знает, как заставить это знать, что это действительно НЕ грязно?
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);
}
}
1 ответ
Вы можете попробовать подобный код, чтобы сбросить сущность так, чтобы 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];
}
}