Как загрузить сущность из базы данных напрямую, кроме кеша, используя NHibernate - PullRequest
0 голосов
/ 29 ноября 2011

Я использую NHibernate для обработки уровня доступа к данным. После внесения изменений в сущность и перед вызовом ISession.Update (entity) я хотел бы получить копию сущности из базы данных напрямую, а затем сохранить ее в таблице аудита для отслеживания истории. Но проблема в том, что сущность кешируется NHibernate. Похоже, что нет способа заставить NHibernate сделать прямой вызов в базу данных, если объект был кэширован?

Я знаю, что могу сделать копию, прежде чем вносить какие-либо изменения в сущность. Мне просто интересно, можно ли заставить NHibernate ударить базу данных в обход кэша? Или как лучше отслеживать историю?

Вот мой метод обновления EntityRepository:

public void Update(BusinessObject Entity) {

        //I would like to get the existing data from database directly.
        //It doesn't work as the entity is cached
        BusinessObject OldEntity = GetById(Entity.Id);

        using (ITransaction trx = session.BeginTransaction()) {

            session.Update(Entity);

            //Add to history tracking table
            History.Add(OldEntity, Entity, "Update");

            trx.Commit();
        }
    }

Очень ценится! Leo

1 Ответ

1 голос
/ 29 ноября 2011

Ты не должен делать это вручную. Уже есть инструменты NHibernate, которые делают это для вас - см., Например, NHibernate.Envers .

Если вы действительно хотите реализовать это самостоятельно, вам следует пойти на несколько уровней глубже, чтобы не было вашей ответственности за хранилище, чтобы отслеживать историю сущностей, поскольку это, кажется, нарушает Принцип единой ответственности и это легко обойти. Вы должны реализовать его в качестве прослушивателя, который слушает события обновления и прозрачно сохраняет предыдущую версию, чтобы ваш код не знал об аудите - см., Например, здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...