NHibernate: Есть ли способ решить, если объект сохраняется или нет? - PullRequest
0 голосов
/ 18 сентября 2010

Мне было интересно, существует ли на самом деле существующий способ выяснить, сохранился ли объект еще или нет? Например, IsPersisted (объект obj) метод ...

Проверка идентификатора на пустое значение сработает, я уверен, но я не до конца продумал это и просто хотел убедиться, что я ничего не пропустил.

Спасибо

Tony

Ответы [ 4 ]

4 голосов
/ 18 сентября 2010

Это ответственность персистента, поэтому я позволю ему выяснить это вместо ручной проверки несохраненного значения:

public bool? IsPersisted(object obj, ISession session)
{
    var sessionFactoryImpl = (ISessionFactoryImplementor)session.SessionFactory;
    var persister = new SessionFactoryHelper(sessionFactoryImpl).RequireClassPersister(obj.GetType().AssemblyQualifiedName);
    return !persister.IsTransient(obj, (ISessionImplementor)session);
}

Персистура персистент делает еще несколько вещей чем просто проверка несохраненного значения, например, проверка версии и кэша второго уровня.И кажется, что не всегда возможно определить, является ли он переходным (возвращает bool?).

3 голосов
/ 18 сентября 2010

Проверка идентификатора на unsaved-value - хороший способ. Это то, что метод session.SaveOrUpdate использует, чтобы решить, испускать ли оператор INSERT или UPDATE.

2 голосов
/ 12 сентября 2017

Я написал следующее расширение ISession, которое, кажется, работает.Если у вас есть что-то лучше, я буду рад это увидеть.

    public static bool IsNewEntity(this ISession session, object entity)
    {
        if (entity == null) return false;

        ISessionImplementor sessionImpl = session.GetSessionImplementation();
        IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
        EntityEntry oldEntry = persistenceContext.GetEntry(entity);

        return oldEntry == null;
    }
1 голос
/ 18 сентября 2010

NHibernate потенциально рассматривает три различных свойства, чтобы увидеть, сохраняется ли сущность.В большинстве случаев проверка Id по несохраненному значению является достаточной.Если Id назначен, будет проверено свойство Version или Timestamp.

  1. Id - это работает, если идентификатор не назначен.
  2. Version - если присутствует и если идентификатор являетсяназначено.
  3. Отметка времени - если имеется и если назначен идентификатор.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...