NHibernate PocoEntityTuplizer устанавливает "грязные" объекты. Как мне это остановить? - PullRequest
4 голосов
/ 15 ноября 2011

Некоторые из моих объектов в моей базе данных используют 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 Ответ

0 голосов
/ 04 ноября 2014

Вы можете попробовать подобный код, чтобы сбросить сущность так, чтобы 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];
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...